diff --git a/app.json b/app.json
index cc3e629..f6dccd7 100644
--- a/app.json
+++ b/app.json
@@ -16,7 +16,7 @@
"supportsTablet": true,
"bundleIdentifier": "com.cally.app",
"googleServicesFile": "./ios/GoogleService-Info.plist",
- "buildNumber": "23",
+ "buildNumber": "30",
"usesAppleSignIn": true
},
"android": {
@@ -74,7 +74,8 @@
"expo-apple-authentication"
],
"expo-font",
- "expo-localization"
+ "expo-localization",
+ "./plugins/withPodfile"
],
"experiments": {
"typedRoutes": true
diff --git a/app/_layout.tsx b/app/_layout.tsx
index 9b2e5f8..fb8d977 100644
--- a/app/_layout.tsx
+++ b/app/_layout.tsx
@@ -52,11 +52,19 @@ import "react-native-reanimated";
import {AuthContextProvider} from "@/contexts/AuthContext";
import {QueryClient, QueryClientProvider} from "react-query";
import {TextProps, ThemeManager, Toast, Typography,} from "react-native-ui-lib";
+import {Platform} from 'react-native';
+import KeyboardManager from 'react-native-keyboard-manager';
SplashScreen.preventAutoHideAsync();
const queryClient = new QueryClient();
+
+if (Platform.OS === 'ios') {
+ KeyboardManager.setEnable(true);
+ KeyboardManager.setToolbarPreviousNextButtonEnable(true);
+}
+
if (__DEV__) {
// functions().useEmulator("localhost", 5001);
// firestore().useEmulator("localhost", 5471);
diff --git a/components/pages/settings/user_settings_views/MyGroup.tsx b/components/pages/settings/user_settings_views/MyGroup.tsx
index de4e2e1..7164082 100644
--- a/components/pages/settings/user_settings_views/MyGroup.tsx
+++ b/components/pages/settings/user_settings_views/MyGroup.tsx
@@ -5,6 +5,7 @@ import {
Colors,
Dialog,
FloatingButton,
+ KeyboardAwareScrollView,
PanningProvider,
Picker,
Text,
@@ -27,6 +28,7 @@ import CircledXIcon from "@/assets/svgs/CircledXIcon";
import ProfileIcon from "@/assets/svgs/ProfileIcon";
import NavToDosIcon from "@/assets/svgs/NavToDosIcon";
import Ionicons from "@expo/vector-icons/Ionicons";
+import {PreviousNextView} from "react-native-keyboard-manager";
const MyGroup = () => {
const [showAddUserDialog, setShowAddUserDialog] = useState(false);
@@ -299,136 +301,151 @@ const MyGroup = () => {
visible={showNewUserInfoDialog}
onDismiss={() => setShowNewUserInfoDialog(false)}
>
-
-
-
- New User Information
-
- {
- setShowNewUserInfoDialog(false)
- }}>
-
-
-
-
+
+
+
+
+
+ New User Information
+
+ {
+ setShowNewUserInfoDialog(false)
+ }}>
+
+
+
+
-
-
- }
- backgroundColor={Colors.grey60}
- style={{borderRadius: 25}}
- center
- />
- {
- }}>
-
- Upload User Profile Photo
+
+
+ }
+ backgroundColor={Colors.grey60}
+ style={{borderRadius: 25}}
+ center
+ />
+ {
+ }}>
+
+ Upload User Profile Photo
+
+
+
+
+ Member Status
+
+ setSelectedStatus(item)}
+ showSearch
+ floatingPlaceholder
+ style={styles.inViewPicker}
+ trailingAccessory={
+
+
+
+ }
+ >
+
+
+
+
+
+
+
+
+ {selectedStatus === ProfileType.FAMILY_DEVICE
+ ? "Device Name"
+ : "First Name"}
-
-
-
- Member Status
-
- setSelectedStatus(item)}
- showSearch
- floatingPlaceholder
- style={styles.inViewPicker}
- trailingAccessory={
-
-
-
- }
- >
-
-
-
-
-
-
-
-
- {selectedStatus === ProfileType.FAMILY_DEVICE
- ? "Device Name"
- : "First Name"}
-
- {
- lNameRef.current?.focus()
- }}
- blurOnSubmit={false}
- />
-
- {selectedStatus !== ProfileType.FAMILY_DEVICE && (
- <>
- Last Name
{
- emailRef.current?.focus()
+ lNameRef.current?.focus()
}}
blurOnSubmit={false}
+ returnKeyType="next"
/>
- >
- )}
- {selectedStatus !== ProfileType.FAMILY_DEVICE && (
- <>
- Email Address (Optional)
-
+ Last Name
+ {
+ emailRef.current?.focus()
+ }}
+ blurOnSubmit={false}
+ returnKeyType="next"
+
+ />
+ >
+ )}
+
+ {selectedStatus !== ProfileType.FAMILY_DEVICE && (
+ <>
+ Email Address (Optional)
+
+ >
+ )}
+
+
+
+
+
);
diff --git a/hooks/firebase/useGetEvents.ts b/hooks/firebase/useGetEvents.ts
index d1f8c15..ae45c89 100644
--- a/hooks/firebase/useGetEvents.ts
+++ b/hooks/firebase/useGetEvents.ts
@@ -12,37 +12,57 @@ export const useGetEvents = () => {
return useQuery({
queryKey: ["events", user?.uid, isFamilyView],
queryFn: async () => {
- const eventsQuery = firestore()
- .collection("Events")
- .where("creatorId", "==", user?.uid)
- .where("attendees", "array-contains", user?.uid);
+ const db = firestore();
+
+ const userId = user?.uid; // Assuming user is defined
+ const familyId = profileData?.familyId; // Assuming profileData is defined
+ let allEvents = [];
if (isFamilyView) {
- eventsQuery.where("familyID", "==", profileData?.familyId);
+ const familyQuery = db.collection("Events").where("familyID", "==", familyId);
+ const familySnapshot = await familyQuery.get();
+ const familyEvents = familySnapshot.docs.map(doc => doc.data());
+
+ allEvents = [...familyEvents];
+ } else {
+ const creatorQuery = db.collection("Events").where("creatorId", "==", userId);
+ const attendeeQuery = db.collection("Events").where("attendees", "array-contains", userId);
+
+ const [creatorSnapshot, attendeeSnapshot] = await Promise.all([
+ creatorQuery.get(),
+ attendeeQuery.get(),
+ ]);
+
+ const creatorEvents = creatorSnapshot.docs.map(doc => doc.data());
+ const attendeeEvents = attendeeSnapshot.docs.map(doc => doc.data());
+
+ allEvents = [...creatorEvents, ...attendeeEvents];
}
- const snapshot = await eventsQuery.get();
+ allEvents = allEvents.filter((event, index, self) =>
+ index === self.findIndex(e => e.id === event.id)
+ );
- return await Promise.all(snapshot.docs.map(async (doc) => {
- const data = doc.data();
+ return await Promise.all(
+ allEvents.map(async (event) => {
+ const profileSnapshot = await db
+ .collection("Profiles")
+ .doc(event.creatorId)
+ .get();
- const profileSnapshot = await firestore()
- .collection("Profiles")
- .doc(data.creatorId)
- .get();
+ const profileData = profileSnapshot.data();
+ const eventColor = profileData?.eventColor || colorMap.pink; // Default color if not found
- const profileData = profileSnapshot.data();
- const eventColor: string = profileData?.eventColor || colorMap.pink // Default color if not found
-
- return {
- id: doc.id,
- title: data.title,
- start: new Date(data.startDate.seconds * 1000),
- end: new Date(data.endDate.seconds * 1000),
- hideHours: data.allDay,
- eventColor: eventColor,
- };
- }));
+ return {
+ id: event.id,
+ title: event.title,
+ start: new Date(event.startDate.seconds * 1000),
+ end: new Date(event.endDate.seconds * 1000),
+ hideHours: event.allDay,
+ eventColor: eventColor,
+ };
+ })
+ );
},
staleTime: Infinity,
cacheTime: Infinity
diff --git a/ios/Podfile b/ios/Podfile
index edd194e..6a08a06 100644
--- a/ios/Podfile
+++ b/ios/Podfile
@@ -14,6 +14,7 @@ install! 'cocoapods',
prepare_react_native_project!
target 'cally' do
+ pod 'IQKeyboardManagerSwift', :git => 'https://github.com/douglasjunior/IQKeyboardManager.git', :branch => 'react-native-keyboard-manager'
use_expo_modules!
config = use_native_modules!
diff --git a/ios/Podfile.lock b/ios/Podfile.lock
index 407bbe1..f8b463d 100644
--- a/ios/Podfile.lock
+++ b/ios/Podfile.lock
@@ -1495,6 +1495,7 @@ PODS:
- hermes-engine (0.74.3):
- hermes-engine/Pre-built (= 0.74.3)
- hermes-engine/Pre-built (0.74.3)
+ - IQKeyboardManagerSwift (6.5.16)
- leveldb-library (1.22.5)
- nanopb (2.30909.1):
- nanopb/decode (= 2.30909.1)
@@ -2688,6 +2689,10 @@ PODS:
- React-logger (= 0.74.3)
- React-perflogger (= 0.74.3)
- React-utils (= 0.74.3)
+ - ReactNativeKeyboardManager (6.5.16-0):
+ - IQKeyboardManagerSwift (= 6.5.16)
+ - React-Core
+ - React-RCTText
- ReactNativeUiLib (4.2.0):
- React
- RecaptchaInterop (100.0.0)
@@ -2831,6 +2836,7 @@ DEPENDENCIES:
- 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`)
+ - IQKeyboardManagerSwift (from `https://github.com/douglasjunior/IQKeyboardManager.git`, branch `react-native-keyboard-manager`)
- RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`)
- RCT-Folly/Fabric (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`)
- RCTDeprecation (from `../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation`)
@@ -2883,6 +2889,7 @@ DEPENDENCIES:
- React-runtimescheduler (from `../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler`)
- React-utils (from `../node_modules/react-native/ReactCommon/react/utils`)
- ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`)
+ - ReactNativeKeyboardManager (from `../node_modules/react-native-keyboard-manager`)
- ReactNativeUiLib (from `../node_modules/react-native-ui-lib`)
- "RNDateTimePicker (from `../node_modules/@react-native-community/datetimepicker`)"
- "RNFBApp (from `../node_modules/@react-native-firebase/app`)"
@@ -3012,6 +3019,9 @@ EXTERNAL SOURCES:
hermes-engine:
:podspec: "../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec"
:tag: hermes-2024-06-28-RNv0.74.3-7bda0c267e76d11b68a585f84cfdd65000babf85
+ IQKeyboardManagerSwift:
+ :branch: react-native-keyboard-manager
+ :git: https://github.com/douglasjunior/IQKeyboardManager.git
RCT-Folly:
:podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec"
RCTDeprecation:
@@ -3112,6 +3122,8 @@ EXTERNAL SOURCES:
:path: "../node_modules/react-native/ReactCommon/react/utils"
ReactCommon:
:path: "../node_modules/react-native/ReactCommon"
+ ReactNativeKeyboardManager:
+ :path: "../node_modules/react-native-keyboard-manager"
ReactNativeUiLib:
:path: "../node_modules/react-native-ui-lib"
RNDateTimePicker:
@@ -3137,6 +3149,11 @@ EXTERNAL SOURCES:
Yoga:
:path: "../node_modules/react-native/ReactCommon/yoga"
+CHECKOUT OPTIONS:
+ IQKeyboardManagerSwift:
+ :commit: 718cbed77cdd5ecd8b779afe543ba5b2df45b40a
+ :git: https://github.com/douglasjunior/IQKeyboardManager.git
+
SPEC CHECKSUMS:
abseil: d121da9ef7e2ff4cab7666e76c5a3e0915ae08c3
AppAuth: 501c04eda8a8d11f179dbe8637b7a91bb7e5d2fa
@@ -3201,6 +3218,7 @@ SPEC CHECKSUMS:
gRPC-Core: eee4be35df218649fe66d721a05a7f27a28f069b
GTMSessionFetcher: 5aea5ba6bd522a239e236100971f10cb71b96ab6
hermes-engine: 1f547997900dd0752dc0cc0ae6dd16173c49e09b
+ IQKeyboardManagerSwift: 90ba81812fbbd6694924a95a271fa3affdf04a14
leveldb-library: e8eadf9008a61f9e1dde3978c086d2b6d9b9dc28
nanopb: d4d75c12cd1316f4a64e3c6963f879ecd4b5e0d5
PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47
@@ -3256,6 +3274,7 @@ SPEC CHECKSUMS:
React-runtimescheduler: e4ad653e1d2f5ff40ba047446cacde009694f0ed
React-utils: 6f7ac39d9a0de447d4334bb25d144a28c0c5d8c9
ReactCommon: 4a09c7d8a06e93c1e2e988a3b9f3db3d2449f2fc
+ ReactNativeKeyboardManager: 704d89bde3cb1e0f432bc273a44eec96eab9d90f
ReactNativeUiLib: deb877cd9b36cf5cad3c72b226bb330060681351
RecaptchaInterop: 7d1a4a01a6b2cb1610a47ef3f85f0c411434cb21
RNDateTimePicker: 40ffda97d071a98a10fdca4fa97e3977102ccd14
@@ -3273,6 +3292,6 @@ SPEC CHECKSUMS:
Yoga: bd92064a0d558be92786820514d74fc4dddd1233
ZXingObjC: 8898711ab495761b2dbbdec76d90164a6d7e14c5
-PODFILE CHECKSUM: 50f618790da7cbbfd5c5e988b7f9370bd45d34a6
+PODFILE CHECKSUM: ae388457578eb44dbbdba1451a584b59f3bc21dd
COCOAPODS: 1.15.2
diff --git a/ios/ReactNativeKeyboardManager.swift b/ios/ReactNativeKeyboardManager.swift
new file mode 100644
index 0000000..a96080a
--- /dev/null
+++ b/ios/ReactNativeKeyboardManager.swift
@@ -0,0 +1,7 @@
+//
+// ReactNativeKeyboardManager.swift
+// cally
+//
+// Created by Milan Paunovic on 20.10.24..
+//
+
diff --git a/ios/cally.xcodeproj/project.pbxproj b/ios/cally.xcodeproj/project.pbxproj
index c9f5a41..311c8c3 100644
--- a/ios/cally.xcodeproj/project.pbxproj
+++ b/ios/cally.xcodeproj/project.pbxproj
@@ -21,7 +21,7 @@
/* Begin PBXFileReference section */
103D20271F044483964A389F /* cally-Bridging-Header.h */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.c.h; name = "cally-Bridging-Header.h"; path = "cally/cally-Bridging-Header.h"; sourceTree = ""; };
- 13B07F961A680F5B00A75B9A /* cally.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = cally.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ 13B07F961A680F5B00A75B9A /* Cally.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Cally.app; sourceTree = BUILT_PRODUCTS_DIR; };
13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = cally/AppDelegate.h; sourceTree = ""; };
13B07FB01A68108700A75B9A /* AppDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AppDelegate.mm; path = cally/AppDelegate.mm; sourceTree = ""; };
13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = cally/Images.xcassets; sourceTree = ""; };
@@ -35,6 +35,7 @@
BB2F792C24A3F905000567C9 /* Expo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Expo.plist; sourceTree = ""; };
ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; };
F20F68FCCB33056D70B2396B /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xml; name = PrivacyInfo.xcprivacy; path = cally/PrivacyInfo.xcprivacy; sourceTree = ""; };
+ F3A90F152CC474F700DDA353 /* ReactNativeKeyboardManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReactNativeKeyboardManager.swift; sourceTree = ""; };
F56C9EADA6FA4AEAA71245EB /* GoogleService-Info.plist */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = text.plist.xml; name = "GoogleService-Info.plist"; path = "cally/GoogleService-Info.plist"; sourceTree = ""; };
FAC715A2D49A985799AEE119 /* ExpoModulesProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExpoModulesProvider.swift; path = "Pods/Target Support Files/Pods-cally/ExpoModulesProvider.swift"; sourceTree = ""; };
/* End PBXFileReference section */
@@ -88,6 +89,7 @@
83CBB9F61A601CBA00E9B192 = {
isa = PBXGroup;
children = (
+ F3A90F152CC474F700DDA353 /* ReactNativeKeyboardManager.swift */,
13B07FAE1A68108700A75B9A /* cally */,
832341AE1AAA6A7D00B99B32 /* Libraries */,
83CBBA001A601CBA00E9B192 /* Products */,
@@ -103,7 +105,7 @@
83CBBA001A601CBA00E9B192 /* Products */ = {
isa = PBXGroup;
children = (
- 13B07F961A680F5B00A75B9A /* cally.app */,
+ 13B07F961A680F5B00A75B9A /* Cally.app */,
);
name = Products;
sourceTree = "";
@@ -166,7 +168,7 @@
);
name = cally;
productName = cally;
- productReference = 13B07F961A680F5B00A75B9A /* cally.app */;
+ productReference = 13B07F961A680F5B00A75B9A /* Cally.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
@@ -317,6 +319,7 @@
"${PODS_CONFIGURATION_BUILD_DIR}/GTMSessionFetcher/GTMSessionFetcher_Core_Privacy.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/GoogleDataTransport/GoogleDataTransport_Privacy.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities/GoogleUtilities_Privacy.bundle",
+ "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift/IQKeyboardManagerSwift.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/PromisesObjC/FBLPromises_Privacy.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/PromisesSwift/Promises_Privacy.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift/ReachabilitySwift.bundle",
@@ -353,6 +356,7 @@
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GTMSessionFetcher_Core_Privacy.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleDataTransport_Privacy.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleUtilities_Privacy.bundle",
+ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/IQKeyboardManagerSwift.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FBLPromises_Privacy.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Promises_Privacy.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ReachabilitySwift.bundle",
@@ -448,7 +452,7 @@
);
OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG";
PRODUCT_BUNDLE_IDENTIFIER = com.cally.app;
- PRODUCT_NAME = "Cally";
+ PRODUCT_NAME = Cally;
SWIFT_OBJC_BRIDGING_HEADER = "cally/cally-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
@@ -482,7 +486,7 @@
);
OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE";
PRODUCT_BUNDLE_IDENTIFIER = com.cally.app;
- PRODUCT_NAME = "Cally";
+ PRODUCT_NAME = Cally;
SWIFT_OBJC_BRIDGING_HEADER = "cally/cally-Bridging-Header.h";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
diff --git a/ios/cally.xcodeproj/xcshareddata/xcschemes/cally.xcscheme b/ios/cally.xcodeproj/xcshareddata/xcschemes/cally.xcscheme
index 098cf8c..96c3bb1 100644
--- a/ios/cally.xcodeproj/xcshareddata/xcschemes/cally.xcscheme
+++ b/ios/cally.xcodeproj/xcshareddata/xcschemes/cally.xcscheme
@@ -15,7 +15,7 @@
@@ -55,7 +55,7 @@
@@ -72,7 +72,7 @@
diff --git a/ios/cally/Info.plist b/ios/cally/Info.plist
index 919ffbc..1e3bcc8 100644
--- a/ios/cally/Info.plist
+++ b/ios/cally/Info.plist
@@ -109,6 +109,7 @@
$(PRODUCT_BUNDLE_IDENTIFIER).expo.index_route
$(PRODUCT_BUNDLE_IDENTIFIER).expo.index_route
$(PRODUCT_BUNDLE_IDENTIFIER).expo.index_route
+ $(PRODUCT_BUNDLE_IDENTIFIER).expo.index_route
UILaunchStoryboardName
SplashScreen
diff --git a/package.json b/package.json
index a729afe..92e580b 100644
--- a/package.json
+++ b/package.json
@@ -76,6 +76,7 @@
"react-native-calendars": "^1.1306.0",
"react-native-gesture-handler": "~2.16.1",
"react-native-gifted-charts": "^1.4.41",
+ "react-native-keyboard-manager": "^6.5.16-0",
"react-native-linear-gradient": "^2.8.3",
"react-native-onboarding-swiper": "^1.3.0",
"react-native-qrcode-svg": "^6.3.2",
diff --git a/plugins/withPodfile.js b/plugins/withPodfile.js
new file mode 100644
index 0000000..fd3a65e
--- /dev/null
+++ b/plugins/withPodfile.js
@@ -0,0 +1,42 @@
+const { withDangerousMod, withPlugins } = require('@expo/config-plugins');
+
+const fs = require('fs');
+const path = require('path');
+
+async function readFile(path) {
+ return fs.promises.readFile(path, 'utf8');
+}
+
+async function saveFile(path, content) {
+ return fs.promises.writeFile(path, content, 'utf8');
+}
+
+module.exports = (config) =>
+ withPlugins(config, [
+ (config) => {
+ return withDangerousMod(config, [
+ 'iOS',
+ async (config) => {
+ const file = path.join(config.modRequest.platformProjectRoot, 'Podfile');
+
+ /*
+ * You need to remove the line before adding it.
+ * If you don't do this and you run `expo prebuild` in a dirt project
+ * your file will have the same line added twice
+ */
+ const contents = (await readFile(file)).replace(
+ /pod 'IQKeyboardManagerSwift', :git => 'https:\/\/github.com\/douglasjunior\/IQKeyboardManager.git', :branch => 'react-native-keyboard-manager'\n\n/g,
+ '',
+ );
+ /*
+ * Now re-adds the content
+ */
+ await saveFile(
+ file,
+ `pod 'IQKeyboardManagerSwift', :git => 'https://github.com/douglasjunior/IQKeyboardManager.git', :branch => 'react-native-keyboard-manager'\n\n${contents}`,
+ );
+ return config;
+ },
+ ]);
+ },
+ ]);
\ No newline at end of file
diff --git a/yarn.lock b/yarn.lock
index 2c6e8c2..087dffe 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -8872,6 +8872,11 @@ react-native-helmet-async@2.0.4:
react-fast-compare "^3.2.2"
shallowequal "^1.1.0"
+react-native-keyboard-manager@^6.5.16-0:
+ version "6.5.16-0"
+ resolved "https://registry.yarnpkg.com/react-native-keyboard-manager/-/react-native-keyboard-manager-6.5.16-0.tgz#ead536f01ade296f483cbf3ecaf3026cff702c9c"
+ integrity sha512-vdNp7PZ0hfxeJXqi7RaHTriQgZqIFKaG3Kx8e4Bdtkne8y9wQ1gGsiAfee+dmmo2kWZaDSbBB7CCKJwRIy5zGg==
+
react-native-linear-gradient@^2.8.3:
version "2.8.3"
resolved "https://registry.npmjs.org/react-native-linear-gradient/-/react-native-linear-gradient-2.8.3.tgz"