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.
-:::
+
+ VIDEO
+
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
+
-
+
-
-
-
-
+
+
+
+
+
);
};
diff --git a/src/core/keyboard.ts b/src/core/keyboard.ts
deleted file mode 100644
index b2f29483d..000000000
--- a/src/core/keyboard.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-import { useFocusEffect } from '@react-navigation/native';
-import { AvoidSoftInput } from 'react-native-avoid-softinput';
-
-/**
- * This hook should be used in every screen that has a form input field to avoid the keyboard
- * This is not a one for all solution, if you want more customization please refer to those examples: https://mateusz1913.github.io/react-native-avoid-softinput/docs/recipes/recipes-form
- */
-
-export const useSoftKeyboardEffect = () => {
- useFocusEffect(() => {
- AvoidSoftInput.setShouldMimicIOSBehavior(true);
- AvoidSoftInput.setEnabled(true);
- // AvoidSoftInput.setAvoidOffset(30);
- AvoidSoftInput.setShowAnimationDelay(0);
- AvoidSoftInput.setShowAnimationDuration(150);
- AvoidSoftInput.setHideAnimationDuration(150);
- AvoidSoftInput.setHideAnimationDelay(0);
- return () => {
- AvoidSoftInput.setAvoidOffset(0);
- AvoidSoftInput.setEnabled(false);
- AvoidSoftInput.setShouldMimicIOSBehavior(false);
- };
- });
-};
diff --git a/src/ui/modal-keyboard-aware-scroll-view.test.tsx b/src/ui/modal-keyboard-aware-scroll-view.test.tsx
new file mode 100644
index 000000000..e2c4a9ac5
--- /dev/null
+++ b/src/ui/modal-keyboard-aware-scroll-view.test.tsx
@@ -0,0 +1,18 @@
+import { render, screen } from '@testing-library/react-native';
+import React from 'react';
+import { View } from 'react-native';
+
+import BottomSheetKeyboardAwareScrollView from './modal-keyboard-aware-scroll-view';
+
+describe('BottomSheetKeyboardAwareScrollView component', () => {
+ it('renders correctly', () => {
+ render(
+
+
+
+ );
+ expect(
+ screen.getByTestId('BottomSheetKeyboardAwareScrollView')
+ ).toBeTruthy();
+ });
+});
diff --git a/src/ui/modal-keyboard-aware-scroll-view.tsx b/src/ui/modal-keyboard-aware-scroll-view.tsx
new file mode 100644
index 000000000..3c8b96ec3
--- /dev/null
+++ b/src/ui/modal-keyboard-aware-scroll-view.tsx
@@ -0,0 +1,42 @@
+// source https://kirillzyusko.github.io/react-native-keyboard-controller/docs/api/components/keyboard-aware-scroll-view
+/**
+ * This component is used to handle the keyboard in a modal.
+ * It is a wrapper around the `KeyboardAwareScrollView` component from `react-native-keyboard-controller`.
+ * It is used to handle the keyboard in a modal.
+ * example usage:
+ export function Example() {
+ return (
+
+
+
+
+ );
+ }
+ */
+import {
+ type BottomSheetScrollViewMethods,
+ createBottomSheetScrollableComponent,
+ SCROLLABLE_TYPE,
+} from '@gorhom/bottom-sheet';
+import type { BottomSheetScrollViewProps } from '@gorhom/bottom-sheet/src/components/bottomSheetScrollable/types';
+import { memo } from 'react';
+import type { KeyboardAwareScrollViewProps } from 'react-native-keyboard-controller';
+import { KeyboardAwareScrollView } from 'react-native-keyboard-controller';
+import Reanimated from 'react-native-reanimated';
+
+const AnimatedScrollView =
+ Reanimated.createAnimatedComponent(
+ KeyboardAwareScrollView
+ );
+const BottomSheetScrollViewComponent = createBottomSheetScrollableComponent<
+ BottomSheetScrollViewMethods,
+ BottomSheetScrollViewProps
+>(SCROLLABLE_TYPE.SCROLLVIEW, AnimatedScrollView);
+const BottomSheetKeyboardAwareScrollView = memo(BottomSheetScrollViewComponent);
+
+BottomSheetKeyboardAwareScrollView.displayName =
+ 'BottomSheetKeyboardAwareScrollView';
+
+export default BottomSheetKeyboardAwareScrollView as (
+ props: BottomSheetScrollViewProps & KeyboardAwareScrollViewProps
+) => ReturnType;