diff --git a/.github/workflows/sonar.yml b/.github/workflows/sonar.yml index 97bedad02..bfd1ea9ff 100644 --- a/.github/workflows/sonar.yml +++ b/.github/workflows/sonar.yml @@ -40,4 +40,5 @@ jobs: -Dsonar.projectKey=${{ secrets.SONAR_PROJECT }} -Dsonar.sonar.sourceEncoding=UTF-8 -Dsonar.javascript.lcov.reportPaths=coverage/lcov.info - -Dsonar.coverage.exclusions=**/storage/**,**/**.config.js,**/*.test.tsx,**/icons/**,**/docs/**,**/cli/**,**/__mocks__/**,**/android/**,**/ios/**,env.js + -Dsonar.coverage.exclusions=**/node_modules/**,**/storage/**,**/**.config.js,**/*.test.ts,**/*.test.tsx,**/*.spec.ts,**/*.spec.tsx,**/icons/**,**/docs/**,**/cli/**,**/android/**,**/ios/**,env.js + -Dsonar.exclusions=,**/__mocks__/** diff --git a/.vscode/settings.json b/.vscode/settings.json index 77952b668..cd547ec00 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -24,20 +24,11 @@ "editor.formatOnSave": true, "editor.defaultFormatter": "astro-build.astro-vscode" }, - "cSpell.words": [ - "Flashlist", - "Lato", - "rootstrap" - ], - "i18n-ally.localesPaths": [ - "src/translations/" - ], + "cSpell.words": ["Flashlist", "Lato", "rootstrap"], + "i18n-ally.localesPaths": ["src/translations/"], "i18n-ally.keystyle": "nested", "i18n-ally.disabled": false, // make sure to disable i18n-ally in your global setting and only enable it for such projects "tailwindCSS.experimental.classRegex": [ - [ - "tv\\(([^)]*)\\)", - "[\"'`]([^\"'`]*).*?[\"'`]" - ] - ], -} \ No newline at end of file + ["tv\\(([^)]*)\\)", "[\"'`]([^\"'`]*).*?[\"'`]"] + ] +} diff --git a/__mocks__/@gorhom/bottom-sheet.ts b/__mocks__/@gorhom/bottom-sheet.ts index 34f938a71..3e9d6a51c 100644 --- a/__mocks__/@gorhom/bottom-sheet.ts +++ b/__mocks__/@gorhom/bottom-sheet.ts @@ -1 +1,9 @@ -module.exports = require('@gorhom/bottom-sheet/mock'); +import { View } from 'react-native'; + +module.exports = { + ...require('@gorhom/bottom-sheet/mock'), + SCROLLABLE_TYPE: { + SCROLLVIEW: 'ScrollView', + }, + createBottomSheetScrollableComponent: jest.fn(() => View), +}; diff --git a/__mocks__/react-native-keyboard-controller.ts b/__mocks__/react-native-keyboard-controller.ts new file mode 100644 index 000000000..d8e8c7a43 --- /dev/null +++ b/__mocks__/react-native-keyboard-controller.ts @@ -0,0 +1 @@ +module.exports = require('react-native-keyboard-controller/jest'); diff --git a/app.config.ts b/app.config.ts index afb5003aa..5cd83e64d 100644 --- a/app.config.ts +++ b/app.config.ts @@ -54,14 +54,6 @@ export default ({ config }: ConfigContext): ExpoConfig => ({ ], 'expo-localization', 'expo-router', - [ - 'expo-build-properties', - { - android: { - kotlinVersion: '1.7.22', // this is for softinput package - }, - }, - ], [ 'app-icon-badge', { diff --git a/docs/src/content/docs/ui-and-theme/Forms.mdx b/docs/src/content/docs/ui-and-theme/Forms.mdx index 17120e1d8..28a01b35f 100644 --- a/docs/src/content/docs/ui-and-theme/Forms.mdx +++ b/docs/src/content/docs/ui-and-theme/Forms.mdx @@ -106,19 +106,14 @@ Any Component with props that inherit from the `InputControllerType` can be used ## Handling Keyboard -The template comes with [`react-native-avoid-softinput`](https://mateusz1913.github.io/react-native-avoid-softinput/) pre-installed and configured to handle the keyboard. You only need to use the `useSoftKeyboardEffect` hook on your screen, and you're good to go. +The template comes with [`react-native-keyboard-controller`](https://kirillzyusko.github.io/react-native-keyboard-controller/) pre-installed and configured to handle the keyboard. You only need to check the [documentation](https://kirillzyusko.github.io/react-native-keyboard-controller/) and use the appropriate approach for your use case. ( note that we already added the `KeyboardProvider` to the layout in the root file) -```tsx -import React from 'react'; -import { useSoftKeyboardEffect } from '@/core/keyboard'; -import { LoginForm } from './login-form'; - -export const Login = () => { - useSoftKeyboardEffect(); - return ; -}; -``` +Make sure to check the following video for more details on how to handle keyboard in react native: -:::tip -Note that the hook is not an all-in-one solution for all cases, and you might need more customization depending on your use case. So, please refer to the documentation [recipes pages](https://mateusz1913.github.io/react-native-avoid-softinput/docs/recipes/recipes-form) for more information. -::: +
+ +
diff --git a/docs/src/styles/custom.css b/docs/src/styles/custom.css index 1d2740e7b..d1b65d844 100644 --- a/docs/src/styles/custom.css +++ b/docs/src/styles/custom.css @@ -80,3 +80,20 @@ font-weight: 600; line-height: 1.2; } + +.embed-container { + position: relative; + padding-bottom: 56.25%; + height: 0; + overflow: hidden; + max-width: 100%; +} +.embed-container iframe, +.embed-container object, +.embed-container embed { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} diff --git a/package.json b/package.json index cd47aedee..23cf6e4d3 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "prebuild": "cross-env EXPO_NO_DOTENV=1 pnpm expo prebuild", "android": "cross-env EXPO_NO_DOTENV=1 expo run:android", "ios": "cross-env EXPO_NO_DOTENV=1 expo run:ios", + "xcode": "xed -b ios", "doctor": "npx expo-doctor@latest", "preinstall": "npx only-allow pnpm", "start:staging": "cross-env APP_ENV=staging pnpm run start", @@ -49,19 +50,18 @@ "@tanstack/react-query": "^5.37.1", "app-icon-badge": "^0.0.15", "axios": "^1.7.1", - "expo": "~51.0.28", - "expo-build-properties": "~0.12.4", + "expo": "~51.0.31", "expo-constants": "~16.0.2", - "expo-dev-client": "~4.0.23", + "expo-dev-client": "~4.0.25", "expo-font": "~12.0.9", - "expo-image": "~1.12.13", + "expo-image": "~1.12.15", "expo-linking": "~6.3.1", "expo-localization": "~15.0.3", "expo-router": "~3.5.23", "expo-splash-screen": "0.27.5", "expo-status-bar": "~1.12.1", "expo-system-ui": "~3.0.7", - "expo-updates": "~0.25.21", + "expo-updates": "~0.25.24", "i18next": "^22.5.1", "lodash.memoize": "^4.1.2", "moti": "^0.28.1", @@ -72,9 +72,9 @@ "react-hook-form": "^7.51.4", "react-i18next": "^12.3.1", "react-native": "0.74.5", - "react-native-avoid-softinput": "^4.0.2", "react-native-flash-message": "^0.4.2", "react-native-gesture-handler": "~2.16.2", + "react-native-keyboard-controller": "^1.13.2", "react-native-mmkv": "2.6.3", "react-native-reanimated": "~3.10.1", "react-native-restart": "0.0.27", @@ -117,7 +117,7 @@ "husky": "^8.0.3", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", - "jest-expo": "~51.0.3", + "jest-expo": "~51.0.4", "jest-junit": "^16.0.0", "lint-staged": "^13.3.0", "metro-babel-register": "^0.73.10", @@ -132,5 +132,5 @@ "type": "git", "url": "git+https://github.com/obytes/react-native-template-obytes.git" }, - "packageManager": "pnpm@9.5.0" + "packageManager": "pnpm@9.8.0" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 63f49fcdb..722d4a35e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -39,44 +39,41 @@ importers: specifier: ^1.7.1 version: 1.7.1 expo: - specifier: ~51.0.28 - version: 51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5)) - expo-build-properties: - specifier: ~0.12.4 - version: 0.12.5(expo@51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) + specifier: ~51.0.31 + version: 51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5)) expo-constants: specifier: ~16.0.2 - version: 16.0.2(expo@51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) + version: 16.0.2(expo@51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) expo-dev-client: - specifier: ~4.0.23 - version: 4.0.23(expo@51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) + specifier: ~4.0.25 + version: 4.0.25(expo@51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) expo-font: specifier: ~12.0.9 - version: 12.0.9(expo@51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) + version: 12.0.9(expo@51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) expo-image: - specifier: ~1.12.13 - version: 1.12.13(expo@51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) + specifier: ~1.12.15 + version: 1.12.15(expo@51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) expo-linking: specifier: ~6.3.1 - version: 6.3.1(expo@51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) + version: 6.3.1(expo@51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) expo-localization: specifier: ~15.0.3 - version: 15.0.3(expo@51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) + version: 15.0.3(expo@51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) expo-router: specifier: ~3.5.23 - version: 3.5.23(d5kl2fyjo5repnzwx6aqe34dbm) + version: 3.5.23(47ggxfirshfhj47m74ldxze65i) expo-splash-screen: specifier: 0.27.5 - version: 0.27.5(expo-modules-autolinking@1.11.2)(expo@51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) + version: 0.27.5(expo-modules-autolinking@1.11.2)(expo@51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) expo-status-bar: specifier: ~1.12.1 version: 1.12.1 expo-system-ui: specifier: ~3.0.7 - version: 3.0.7(expo@51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) + version: 3.0.7(expo@51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) expo-updates: - specifier: ~0.25.21 - version: 0.25.22(expo@51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) + specifier: ~0.25.24 + version: 0.25.24(expo@51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) i18next: specifier: ^22.5.1 version: 22.5.1 @@ -107,15 +104,15 @@ importers: react-native: specifier: 0.74.5 version: 0.74.5(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.79)(react@18.2.0) - react-native-avoid-softinput: - specifier: ^4.0.2 - version: 4.0.2(react-native@0.74.5(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0) react-native-flash-message: specifier: ^0.4.2 version: 0.4.2(prop-types@15.8.1)(react-native@0.74.5(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0) react-native-gesture-handler: specifier: ~2.16.2 version: 2.16.2(react-native@0.74.5(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0) + react-native-keyboard-controller: + specifier: ^1.13.2 + version: 1.13.2(react-native-reanimated@3.10.1(@babel/core@7.24.5)(react-native@0.74.5(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0))(react-native@0.74.5(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0) react-native-mmkv: specifier: 2.6.3 version: 2.6.3(react-native@0.74.5(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0) @@ -161,10 +158,10 @@ importers: version: 17.8.1 '@dev-plugins/react-navigation': specifier: ^0.0.6 - version: 0.0.6(@react-navigation/core@6.4.16(react@18.2.0))(expo@51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5)))(react@18.2.0) + version: 0.0.6(@react-navigation/core@6.4.16(react@18.2.0))(expo@51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5)))(react@18.2.0) '@dev-plugins/react-query': specifier: ^0.0.6 - version: 0.0.6(@tanstack/react-query@5.37.1(react@18.2.0))(expo@51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) + version: 0.0.6(@tanstack/react-query@5.37.1(react@18.2.0))(expo@51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) '@expo/config': specifier: ~9.0.2 version: 9.0.2 @@ -238,8 +235,8 @@ importers: specifier: ^29.7.0 version: 29.7.0 jest-expo: - specifier: ~51.0.3 - version: 51.0.3(@babel/core@7.24.5)(jest@29.7.0(@types/node@20.12.12)(ts-node@10.9.2(@types/node@20.12.12)(typescript@5.3.3)))(react@18.2.0) + specifier: ~51.0.4 + version: 51.0.4(@babel/core@7.24.5)(jest@29.7.0(@types/node@20.12.12)(ts-node@10.9.2(@types/node@20.12.12)(typescript@5.3.3)))(react@18.2.0) jest-junit: specifier: ^16.0.0 version: 16.0.0 @@ -3563,23 +3560,18 @@ packages: peerDependencies: expo: '*' - expo-build-properties@0.12.5: - resolution: {integrity: sha512-donC1le0PYfLKCPKRMGQoixuWuwDWCngzXSoQXUPsgHTDHQUKr8aw+lcWkTwZcItgNovcnk784I0dyfYDcxybA==} - peerDependencies: - expo: '*' - expo-constants@16.0.2: resolution: {integrity: sha512-9tNY3OVO0jfiMzl7ngb6IOyR5VFzNoN5OOazUWoeGfmMqVB5kltTemRvKraK9JRbBKIw+SOYLEmF0sEqgFZ6OQ==} peerDependencies: expo: '*' - expo-dev-client@4.0.23: - resolution: {integrity: sha512-s0qTAxrvpztQUpi0WS/JKddon04jZqnAHcwiMsuDyt+VSqDL6VF3aZAGl8dI5ZEDsq/cT3jETyNxY8CMkvLmyA==} + expo-dev-client@4.0.25: + resolution: {integrity: sha512-yChhepKXvdw+1vXIayvnvU9s42DJfgmAtBC9JLu7Q+Bk/SqgLxmEBpcxj9iBhu9x79bnrbgHEkGaLi+N1PljyA==} peerDependencies: expo: '*' - expo-dev-launcher@4.0.25: - resolution: {integrity: sha512-uwdcQvBGMXl1WAlOg0Qb827xDogJcqSHKjIkB+YOPjUPdf9NsLN9AwUHZqIK1wOcmvi0pfgv1fPzTgoE9AwNcw==} + expo-dev-launcher@4.0.27: + resolution: {integrity: sha512-n+uUkcr5f5v5VR0sDw/sGna4aut2nTu3EiOqA0ijb8fBuelpgqYiBp2x7Su6wT6InoBHZxTBgVlyzgLNFGSdDw==} peerDependencies: expo: '*' @@ -3588,8 +3580,8 @@ packages: peerDependencies: expo: '*' - expo-dev-menu@5.0.19: - resolution: {integrity: sha512-C/ulbzfhcEsEk1X0gF3XaJPSwCZJqnHPpYqPGUf4xaXzk/TZpeMTqF6f3nfMyZjpj67L6DetvaJWv8jiDzZ/6Q==} + expo-dev-menu@5.0.21: + resolution: {integrity: sha512-i7kOaxOeBksqgeUDvb5vb2cZIVLZhAX2rjLJNH3fBifiAWISeCBAQsKN9vAkMPQGqL9F88vjMyy14ca6Vo+fEw==} peerDependencies: expo: '*' @@ -3606,8 +3598,8 @@ packages: peerDependencies: expo: '*' - expo-image@1.12.13: - resolution: {integrity: sha512-Dmuc5qmkIsl1nFj8C3Ux3wL2bN4QYW4dM9fkGA8kYiP5Fxf1lT36ldkHk2O2lPFRSFJDvLxT8Tz+7GTko5fzwQ==} + expo-image@1.12.15: + resolution: {integrity: sha512-rjvnNSaFnrmlugDESTaYJhgdqRLn+M5vu0lD5NGNd2LkxGG5HrRV3gSzeyQQ68XRhrDN8eJvkcKujPKJUTMraw==} peerDependencies: expo: '*' @@ -3636,8 +3628,8 @@ packages: resolution: {integrity: sha512-fdcaNO8ucHA3yLNY52ZUENBcAG7KEx8QyMmnVNavO1JVBGRMZG8JyVcbrhYQDtVtpxkbai5YzwvLutINvbDZDQ==} hasBin: true - expo-modules-core@1.12.21: - resolution: {integrity: sha512-UQxRljqPcowS1+bECW9tnuVGfvWL18GAKPiKMnu9sZwJssAN9FU/JhED50DJzdzICLR0hL17FZAgV4rbMG3IWQ==} + expo-modules-core@1.12.23: + resolution: {integrity: sha512-NYp/rWhKW6zlqNdC8/r+FckzlAGWX0IJEjOxwYHuYeRUn/vnKksb43G4E3jcaQEZgmWlKxK4LpxL3gr7m0RJFA==} expo-router@3.5.23: resolution: {integrity: sha512-Re2kYcxov67hWrcjuu0+3ovsLxYn79PuX6hgtYN20MgigY5ttX79KOIBEVGTO3F3y9dxSrGHyy5Z14BcO+usGQ==} @@ -3680,14 +3672,14 @@ packages: peerDependencies: expo: '*' - expo-updates@0.25.22: - resolution: {integrity: sha512-ebu+wPnISzJ/H70CFAJAybS4ZZrACxRbgr9SMqOI/h84CwXGmdxzLmgxoNhy5q/Fa1u7JBmSr6x9a7psBDT4Cw==} + expo-updates@0.25.24: + resolution: {integrity: sha512-juqdOUvaMfu6zeUg3fTk6ciLw4QK+0HXNR0+X41BVOFilNmlTFQZ6LyRGJAZJP7HQs2bHR5d/btAXkejtIqVXw==} hasBin: true peerDependencies: expo: '*' - expo@51.0.28: - resolution: {integrity: sha512-R+0tSV0Zf5R+DxN4W3mLFlVvYVpiJ+dtYrMmBedIRw0A54we50QRM1jS0Gq2Bdzg2JtainSEApdQXUC6r9j/BA==} + expo@51.0.31: + resolution: {integrity: sha512-YiUNcxzSkQ0jlKW+e8F81KnZfAhCugEZI9VYmuIsFONHivtiYIADHdcFvUWnexUEdgPQDkgWw85XBnIbzIZ39Q==} hasBin: true external-editor@3.1.0: @@ -4621,8 +4613,8 @@ packages: resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-expo@51.0.3: - resolution: {integrity: sha512-r49OuS9X2S/dH+lSfNmarBS2L/tgvBhzOgKHYFyDJWo+Bb5uVs7Rg/GZal/RD/NDkKFJuByGAaW1F6zHYnjZnw==} + jest-expo@51.0.4: + resolution: {integrity: sha512-WmlR4rUur1TNF/F14brKCmPdX3TWf7Bno/6A1PuxnflN79LEIXpXuPKMlMWwCCChTohGB5FRniknRibblWu1ug==} hasBin: true jest-get-type@22.4.3: @@ -6099,12 +6091,6 @@ packages: react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - react-native-avoid-softinput@4.0.2: - resolution: {integrity: sha512-/i8xNWGjpu3hEPCVjW2WsWTsM/mC4zTBr3DabOrdPfgw9Ww0Na69YQY1TSXCjbTjJmWwfTToPK5OEVm+ZwHmiQ==} - peerDependencies: - react: '>=17.0.0' - react-native: '>=0.65.0' - react-native-css-interop@0.0.36: resolution: {integrity: sha512-ZWoKQlq6XrI5DB4BdPk5ABvJQsX7zls1SQYWuYXOQB8u5QE0KH3OfOGAGRZPekTjgkhjqGO4Bf8G2JTSWAYMSg==} engines: {node: '>=18'} @@ -6144,6 +6130,13 @@ packages: peerDependencies: react-native: '>=0.42.0' + react-native-keyboard-controller@1.13.2: + resolution: {integrity: sha512-FZkxByqboqa2bq2fXtEnD7f78VmKbu5cHjEfubHfV2ZtkGolZ01XTqKkEQ172GvFSjC5iuF1L3h7C4g8R6Xq9Q==} + peerDependencies: + react: '*' + react-native: '*' + react-native-reanimated: '>=3.0.0' + react-native-mmkv@2.6.3: resolution: {integrity: sha512-CkLAU5EX18eDw0Q+h6qEXPvynb+NVDu54cOY3h4h9VUhaaflfAmGWBJRQCBQz5M0VdnS8utjgJNryTAWKUTqpw==} peerDependencies: @@ -8641,19 +8634,19 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@dev-plugins/react-navigation@0.0.6(@react-navigation/core@6.4.16(react@18.2.0))(expo@51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5)))(react@18.2.0)': + '@dev-plugins/react-navigation@0.0.6(@react-navigation/core@6.4.16(react@18.2.0))(expo@51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5)))(react@18.2.0)': dependencies: '@react-navigation/core': 6.4.16(react@18.2.0) '@react-navigation/devtools': 6.0.26(react@18.2.0) - expo: 51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5)) + expo: 51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5)) nanoid: 3.3.7 transitivePeerDependencies: - react - '@dev-plugins/react-query@0.0.6(@tanstack/react-query@5.37.1(react@18.2.0))(expo@51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5)))': + '@dev-plugins/react-query@0.0.6(@tanstack/react-query@5.37.1(react@18.2.0))(expo@51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5)))': dependencies: '@tanstack/react-query': 5.37.1(react@18.2.0) - expo: 51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5)) + expo: 51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5)) flatted: 3.3.1 '@egjs/hammerjs@2.0.17': @@ -12026,99 +12019,93 @@ snapshots: jest-message-util: 29.7.0 jest-util: 29.7.0 - expo-asset@10.0.10(expo@51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))): + expo-asset@10.0.10(expo@51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))): dependencies: - expo: 51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5)) - expo-constants: 16.0.2(expo@51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) + expo: 51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5)) + expo-constants: 16.0.2(expo@51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) invariant: 2.2.4 md5-file: 3.2.3 transitivePeerDependencies: - supports-color - expo-build-properties@0.12.5(expo@51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))): - dependencies: - ajv: 8.13.0 - expo: 51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5)) - semver: 7.6.2 - - expo-constants@16.0.2(expo@51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))): + expo-constants@16.0.2(expo@51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))): dependencies: '@expo/config': 9.0.2 '@expo/env': 0.3.0 - expo: 51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5)) + expo: 51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5)) transitivePeerDependencies: - supports-color - expo-dev-client@4.0.23(expo@51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))): + expo-dev-client@4.0.25(expo@51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))): dependencies: - expo: 51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5)) - expo-dev-launcher: 4.0.25(expo@51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) - expo-dev-menu: 5.0.19(expo@51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) - expo-dev-menu-interface: 1.8.3(expo@51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) - expo-manifests: 0.14.3(expo@51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) - expo-updates-interface: 0.16.2(expo@51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) + expo: 51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5)) + expo-dev-launcher: 4.0.27(expo@51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) + expo-dev-menu: 5.0.21(expo@51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) + expo-dev-menu-interface: 1.8.3(expo@51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) + expo-manifests: 0.14.3(expo@51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) + expo-updates-interface: 0.16.2(expo@51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) transitivePeerDependencies: - supports-color - expo-dev-launcher@4.0.25(expo@51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))): + expo-dev-launcher@4.0.27(expo@51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))): dependencies: ajv: 8.11.0 - expo: 51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5)) - expo-dev-menu: 5.0.19(expo@51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) - expo-manifests: 0.14.3(expo@51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) + expo: 51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5)) + expo-dev-menu: 5.0.21(expo@51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) + expo-manifests: 0.14.3(expo@51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) resolve-from: 5.0.0 semver: 7.6.2 transitivePeerDependencies: - supports-color - expo-dev-menu-interface@1.8.3(expo@51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))): + expo-dev-menu-interface@1.8.3(expo@51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))): dependencies: - expo: 51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5)) + expo: 51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5)) - expo-dev-menu@5.0.19(expo@51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))): + expo-dev-menu@5.0.21(expo@51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))): dependencies: - expo: 51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5)) - expo-dev-menu-interface: 1.8.3(expo@51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) + expo: 51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5)) + expo-dev-menu-interface: 1.8.3(expo@51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) semver: 7.6.2 expo-eas-client@0.12.0: {} - expo-file-system@17.0.1(expo@51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))): + expo-file-system@17.0.1(expo@51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))): dependencies: - expo: 51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5)) + expo: 51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5)) - expo-font@12.0.9(expo@51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))): + expo-font@12.0.9(expo@51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))): dependencies: - expo: 51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5)) + expo: 51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5)) fontfaceobserver: 2.3.0 - expo-image@1.12.13(expo@51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))): + expo-image@1.12.15(expo@51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))): dependencies: - expo: 51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5)) + expo: 51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5)) expo-json-utils@0.13.1: {} - expo-keep-awake@13.0.2(expo@51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))): + expo-keep-awake@13.0.2(expo@51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))): dependencies: - expo: 51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5)) + expo: 51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5)) - expo-linking@6.3.1(expo@51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))): + expo-linking@6.3.1(expo@51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))): dependencies: - expo-constants: 16.0.2(expo@51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) + expo-constants: 16.0.2(expo@51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) invariant: 2.2.4 transitivePeerDependencies: - expo - supports-color - expo-localization@15.0.3(expo@51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))): + expo-localization@15.0.3(expo@51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))): dependencies: - expo: 51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5)) + expo: 51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5)) rtl-detect: 1.1.2 - expo-manifests@0.14.3(expo@51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))): + expo-manifests@0.14.3(expo@51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))): dependencies: '@expo/config': 9.0.3 - expo: 51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5)) + expo: 51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5)) expo-json-utils: 0.13.1 transitivePeerDependencies: - supports-color @@ -12133,11 +12120,11 @@ snapshots: require-from-string: 2.0.2 resolve-from: 5.0.0 - expo-modules-core@1.12.21: + expo-modules-core@1.12.23: dependencies: invariant: 2.2.4 - expo-router@3.5.23(d5kl2fyjo5repnzwx6aqe34dbm): + expo-router@3.5.23(47ggxfirshfhj47m74ldxze65i): dependencies: '@expo/metro-runtime': 3.2.3(react-native@0.74.5(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.79)(react@18.2.0)) '@expo/server': 0.4.2(typescript@5.3.3) @@ -12145,10 +12132,10 @@ snapshots: '@react-navigation/bottom-tabs': 6.5.20(@react-navigation/native@6.1.17(react-native@0.74.5(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0))(react-native-safe-area-context@4.10.5(react-native@0.74.5(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0))(react-native-screens@3.31.1(react-native@0.74.5(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0))(react-native@0.74.5(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0) '@react-navigation/native': 6.1.17(react-native@0.74.5(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0) '@react-navigation/native-stack': 6.9.26(@react-navigation/native@6.1.17(react-native@0.74.5(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0))(react-native-safe-area-context@4.10.5(react-native@0.74.5(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0))(react-native-screens@3.31.1(react-native@0.74.5(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0))(react-native@0.74.5(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0) - expo: 51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5)) - expo-constants: 16.0.2(expo@51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) - expo-linking: 6.3.1(expo@51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) - expo-splash-screen: 0.27.5(expo-modules-autolinking@1.11.2)(expo@51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) + expo: 51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5)) + expo-constants: 16.0.2(expo@51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) + expo-linking: 6.3.1(expo@51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) + expo-splash-screen: 0.27.5(expo-modules-autolinking@1.11.2)(expo@51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) expo-status-bar: 1.12.1 react-native-helmet-async: 2.0.4(react@18.2.0) react-native-safe-area-context: 4.10.5(react-native@0.74.5(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0) @@ -12164,10 +12151,10 @@ snapshots: - supports-color - typescript - expo-splash-screen@0.27.5(expo-modules-autolinking@1.11.2)(expo@51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))): + expo-splash-screen@0.27.5(expo-modules-autolinking@1.11.2)(expo@51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))): dependencies: '@expo/prebuild-config': 7.0.6(expo-modules-autolinking@1.11.2) - expo: 51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5)) + expo: 51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5)) transitivePeerDependencies: - encoding - expo-modules-autolinking @@ -12177,19 +12164,19 @@ snapshots: expo-structured-headers@3.8.0: {} - expo-system-ui@3.0.7(expo@51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))): + expo-system-ui@3.0.7(expo@51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))): dependencies: '@react-native/normalize-colors': 0.74.85 debug: 4.3.4 - expo: 51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5)) + expo: 51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5)) transitivePeerDependencies: - supports-color - expo-updates-interface@0.16.2(expo@51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))): + expo-updates-interface@0.16.2(expo@51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))): dependencies: - expo: 51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5)) + expo: 51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5)) - expo-updates@0.25.22(expo@51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))): + expo-updates@0.25.24(expo@51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))): dependencies: '@expo/code-signing-certificates': 0.0.5 '@expo/config': 9.0.3 @@ -12198,11 +12185,11 @@ snapshots: '@expo/spawn-async': 1.7.2 arg: 4.1.0 chalk: 4.1.2 - expo: 51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5)) + expo: 51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5)) expo-eas-client: 0.12.0 - expo-manifests: 0.14.3(expo@51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) + expo-manifests: 0.14.3(expo@51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) expo-structured-headers: 3.8.0 - expo-updates-interface: 0.16.2(expo@51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) + expo-updates-interface: 0.16.2(expo@51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) fast-glob: 3.3.2 fbemitter: 3.0.0 ignore: 5.3.1 @@ -12211,7 +12198,7 @@ snapshots: - encoding - supports-color - expo@51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5)): + expo@51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5)): dependencies: '@babel/runtime': 7.24.5 '@expo/cli': 0.18.29(expo-modules-autolinking@1.11.2) @@ -12220,12 +12207,12 @@ snapshots: '@expo/metro-config': 0.18.11 '@expo/vector-icons': 14.0.2 babel-preset-expo: 11.0.14(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5)) - expo-asset: 10.0.10(expo@51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) - expo-file-system: 17.0.1(expo@51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) - expo-font: 12.0.9(expo@51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) - expo-keep-awake: 13.0.2(expo@51.0.28(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) + expo-asset: 10.0.10(expo@51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) + expo-file-system: 17.0.1(expo@51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) + expo-font: 12.0.9(expo@51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) + expo-keep-awake: 13.0.2(expo@51.0.31(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))) expo-modules-autolinking: 1.11.2 - expo-modules-core: 1.12.21 + expo-modules-core: 1.12.23 fbemitter: 3.0.0 whatwg-url-without-unicode: 8.0.0-3 transitivePeerDependencies: @@ -13303,9 +13290,9 @@ snapshots: jest-mock: 29.7.0 jest-util: 29.7.0 - jest-expo@51.0.3(@babel/core@7.24.5)(jest@29.7.0(@types/node@20.12.12)(ts-node@10.9.2(@types/node@20.12.12)(typescript@5.3.3)))(react@18.2.0): + jest-expo@51.0.4(@babel/core@7.24.5)(jest@29.7.0(@types/node@20.12.12)(ts-node@10.9.2(@types/node@20.12.12)(typescript@5.3.3)))(react@18.2.0): dependencies: - '@expo/config': 9.0.2 + '@expo/config': 9.0.3 '@expo/json-file': 8.3.3 '@jest/create-cache-key-function': 29.7.0 babel-jest: 29.7.0(@babel/core@7.24.5) @@ -15058,11 +15045,6 @@ snapshots: react-is@18.3.1: {} - react-native-avoid-softinput@4.0.2(react-native@0.74.5(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0): - dependencies: - react: 18.2.0 - react-native: 0.74.5(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.79)(react@18.2.0) - react-native-css-interop@0.0.36(@babel/core@7.24.5)(react-native-reanimated@3.10.1(@babel/core@7.24.5)(react-native@0.74.5(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0))(react-native-safe-area-context@4.10.5(react-native@0.74.5(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0))(react-native-svg@15.2.0(react-native@0.74.5(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0))(react-native@0.74.5(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0)(tailwindcss@3.3.2(ts-node@10.9.2(@types/node@20.12.12)(typescript@5.3.3))): dependencies: '@babel/helper-module-imports': 7.24.3 @@ -15109,6 +15091,12 @@ snapshots: dependencies: react-native: 0.74.5(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.79)(react@18.2.0) + react-native-keyboard-controller@1.13.2(react-native-reanimated@3.10.1(@babel/core@7.24.5)(react-native@0.74.5(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0))(react-native@0.74.5(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0): + dependencies: + react: 18.2.0 + react-native: 0.74.5(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.79)(react@18.2.0) + react-native-reanimated: 3.10.1(@babel/core@7.24.5)(react-native@0.74.5(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0) + react-native-mmkv@2.6.3(react-native@0.74.5(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0): dependencies: react: 18.2.0 diff --git a/src/api/common/axios.d.ts b/src/api/common/axios.d.ts new file mode 100644 index 000000000..8705ad542 --- /dev/null +++ b/src/api/common/axios.d.ts @@ -0,0 +1,14 @@ +import type { InternalAxiosRequestConfig } from 'axios'; + +declare module 'axios' { + // TODO: remove this when axios typings are updated + // PR: https://github.com/axios/axios/pull/6138 + interface AxiosInterceptorManager { + handlers: Array<{ + fulfilled: ((value: V) => V | Promise) | null; + rejected: ((error: any) => any) | null; + synchronous: boolean; + runWhen: (config: InternalAxiosRequestConfig) => boolean | null; + }>; + } +} diff --git a/src/api/common/interceptors.spec.ts b/src/api/common/interceptors.spec.ts new file mode 100644 index 000000000..05264a6c3 --- /dev/null +++ b/src/api/common/interceptors.spec.ts @@ -0,0 +1,138 @@ +import type { AxiosResponse, InternalAxiosRequestConfig } from 'axios'; +import { AxiosError, AxiosHeaders } from 'axios'; + +import interceptors from '@/api/common/interceptors'; + +import { client } from './client'; + +const testRequestInterceptors = () => { + describe('request interceptors', () => { + describe('when the request has data', () => { + const restConfig = { + baseURL: 'http://localhost:3000', + url: '/test', + headers: new AxiosHeaders({ + 'Content-Type': 'application/json', + }), + }; + + const config: InternalAxiosRequestConfig = { + data: { + fooBar: 'foo', + barBaz: 'bar', + }, + ...restConfig, + }; + + let interceptedConfig: InternalAxiosRequestConfig; + + beforeEach(async () => { + const { fulfilled } = client.interceptors.request.handlers[0]; + + if (!fulfilled) { + return; + } + + interceptedConfig = await fulfilled(config); + }); + + it('should convert the data to snake_case', () => { + expect(interceptedConfig.data).toEqual({ + foo_bar: 'foo', + bar_baz: 'bar', + }); + }); + + it('should not modify the rest of the config', () => { + expect(interceptedConfig).toMatchObject(config); + }); + }); + + describe('when the request has no data', () => { + const config: InternalAxiosRequestConfig = { + baseURL: 'http://localhost:3000', + url: '/test', + headers: new AxiosHeaders({ + 'Content-Type': 'application/json', + }), + }; + + let interceptedConfig: InternalAxiosRequestConfig; + + beforeEach(async () => { + const { fulfilled } = client.interceptors.request.handlers[0]; + + if (!fulfilled) { + return; + } + + interceptedConfig = await fulfilled(config); + }); + + it('should not modify the config', () => { + expect(interceptedConfig).toEqual(config); + }); + }); + }); +}; + +const testResponseInterceptors = () => { + describe('response interceptors', () => { + describe('when the response is successful', () => { + const response: AxiosResponse = { + status: 200, + statusText: 'OK', + headers: {}, + config: { + headers: new AxiosHeaders({}), + }, + data: { + foo_bar: 'foo', + bar_baz: 'bar', + }, + }; + + let interceptedResponse: AxiosResponse; + + beforeEach(async () => { + const { fulfilled } = client.interceptors.response.handlers[0]; + + if (!fulfilled) { + return; + } + + interceptedResponse = await fulfilled(response); + }); + + it('camelizes the response data', async () => { + expect(interceptedResponse.data).toEqual({ + fooBar: 'foo', + barBaz: 'bar', + }); + }); + }); + + describe('when the response is an error', () => { + const axiosError = new AxiosError('API error'); + + it('throws the same error', async () => { + const { rejected } = client.interceptors.response.handlers[0]; + + if (!rejected) { + return; + } + + await expect(rejected(axiosError)).rejects.toEqual(axiosError); + }); + }); + }); +}; + +describe('interceptors', () => { + beforeAll(() => { + interceptors(); + }); + + testRequestInterceptors(); + testResponseInterceptors(); +}); diff --git a/src/app/_layout.tsx b/src/app/_layout.tsx index 5d8aa09ee..84c9ce471 100644 --- a/src/app/_layout.tsx +++ b/src/app/_layout.tsx @@ -1,4 +1,3 @@ -/* eslint-disable react/react-in-jsx-scope */ import { useReactNavigationDevTools } from '@dev-plugins/react-navigation'; import { BottomSheetModalProvider } from '@gorhom/bottom-sheet'; import { ThemeProvider } from '@react-navigation/native'; @@ -6,6 +5,7 @@ import { SplashScreen, Stack, useNavigationContainerRef } from 'expo-router'; import { StyleSheet } from 'react-native'; import FlashMessage from 'react-native-flash-message'; import { GestureHandlerRootView } from 'react-native-gesture-handler'; +import { KeyboardProvider } from 'react-native-keyboard-controller'; import { APIProvider } from '@/api'; import interceptors from '@/api/common/interceptors'; @@ -17,6 +17,8 @@ export { ErrorBoundary } from 'expo-router'; // Import global CSS file import '../../global.css'; +import React from 'react'; + export const unstable_settings = { initialRouteName: '(app)', }; @@ -52,14 +54,16 @@ function Providers({ children }: { children: React.ReactNode }) { style={styles.container} className={theme.dark ? `dark` : undefined} > - - - - {children} - - - - + + + + + {children} + + + + + ); } diff --git a/src/app/login.tsx b/src/app/login.tsx index 7878255a1..deacb6d2f 100644 --- a/src/app/login.tsx +++ b/src/app/login.tsx @@ -4,13 +4,11 @@ import React from 'react'; import type { LoginFormProps } from '@/components/login-form'; import { LoginForm } from '@/components/login-form'; import { useAuth } from '@/core'; -import { useSoftKeyboardEffect } from '@/core/keyboard'; import { FocusAwareStatusBar } from '@/ui'; export default function Login() { const router = useRouter(); const signIn = useAuth.use.signIn(); - useSoftKeyboardEffect(); const onSubmit: LoginFormProps['onSubmit'] = (data) => { console.log(data); diff --git a/src/components/login-form.tsx b/src/components/login-form.tsx index 278b42cbb..a949b71af 100644 --- a/src/components/login-form.tsx +++ b/src/components/login-form.tsx @@ -2,6 +2,7 @@ import { zodResolver } from '@hookform/resolvers/zod'; import React from 'react'; import type { SubmitHandler } from 'react-hook-form'; import { useForm } from 'react-hook-form'; +import { KeyboardAvoidingView } from 'react-native-keyboard-controller'; import * as z from 'zod'; import { Button, ControlledInput, Text, View } from '@/ui'; @@ -31,37 +32,43 @@ export const LoginForm = ({ onSubmit = () => {} }: LoginFormProps) => { resolver: zodResolver(schema), }); return ( - - - Sign In - + + + + Sign In + - + - - -