From 660d14260a79a33d9407c89e38f4418483679fcc Mon Sep 17 00:00:00 2001 From: Jaanu423 Date: Fri, 19 Sep 2025 13:22:30 +0530 Subject: [PATCH] added fetch contact from real device icon --- src/screens/OtpVarificationScreen.tsx | 2 +- src/screens/management/YourContacts.tsx | 455 +++++++++++++----------- src/screens/profile/Profile.tsx | 27 +- src/screens/profile/SwitchNavigator.tsx | 22 +- 4 files changed, 281 insertions(+), 225 deletions(-) diff --git a/src/screens/OtpVarificationScreen.tsx b/src/screens/OtpVarificationScreen.tsx index c611f49..162a27e 100644 --- a/src/screens/OtpVarificationScreen.tsx +++ b/src/screens/OtpVarificationScreen.tsx @@ -105,7 +105,7 @@ export default function OtpVerificationScreen() { { headers: { "Content-Type": "application/json", Accept: "*/*" } } ); - console.log("📩 OTP Resent:", res.data); + console.log("📩 OTP Resent:", res); setCode(Array(CELL_COUNT).fill("")); inputs.current[0]?.focus(); ToastAndroid.show("OTP Sent", ToastAndroid.SHORT); diff --git a/src/screens/management/YourContacts.tsx b/src/screens/management/YourContacts.tsx index 1dc2137..d256c99 100644 --- a/src/screens/management/YourContacts.tsx +++ b/src/screens/management/YourContacts.tsx @@ -1,229 +1,274 @@ + + import React, { useState, useEffect } from "react"; import { - StyleSheet, - Text, - View, - FlatList, - TouchableOpacity, - Modal, - PermissionsAndroid, - Platform, - NativeModules, + StyleSheet, + Text, + View, + FlatList, + TouchableOpacity, + Modal, + PermissionsAndroid, + Platform, + NativeModules, + Linking, + Alert, } from "react-native"; +import AppView from "../../components/AppView"; const { ContactsModule } = NativeModules; +const APP_URL = "https://play.google.com/store/apps/details?id=com.yourapp"; // replace with your real app url + const YourContacts = () => { - const [contacts, setContacts] = useState([]); - const [selectedContact, setSelectedContact] = useState(null); - const [modalVisible, setModalVisible] = useState(false); + const [contacts, setContacts] = useState([]); + const [selectedContact, setSelectedContact] = useState(null); + const [modalVisible, setModalVisible] = useState(false); - useEffect(() => { - handleFetchContacts(); - }, []); + useEffect(() => { + handleFetchContacts(); + }, []); - const handleFetchContacts = async () => { - try { - if (Platform.OS === "android") { - const granted = await PermissionsAndroid.request( - PermissionsAndroid.PERMISSIONS.READ_CONTACTS, - { - title: "Contacts Permission", - message: "This app would like to view your contacts.", - buttonPositive: "OK", - } - ); + const handleFetchContacts = async () => { + try { + if (Platform.OS === "android") { + const granted = await PermissionsAndroid.request( + PermissionsAndroid.PERMISSIONS.READ_CONTACTS, + { + title: "Contacts Permission", + message: "This app would like to view your contacts.", + buttonPositive: "OK", + } + ); - if (granted !== PermissionsAndroid.RESULTS.GRANTED) { - console.log("Contacts permission denied"); - return; + if (granted !== PermissionsAndroid.RESULTS.GRANTED) { + console.log("Contacts permission denied"); + return; + } + } + + const fetchedContacts = await ContactsModule.getContacts(); + setContacts(fetchedContacts); + } catch (error) { + console.error("Error fetching contacts:", error); } - } + }; - const fetchedContacts = await ContactsModule.getContacts(); - setContacts(fetchedContacts); - } catch (error) { - console.error("Error fetching contacts:", error); - } - }; + const APP_URL = "https://play.google.com/store/apps/details?id=com.yourapp"; // your app link + const WHATSAPP_URL = "https://play.google.com/store/apps/details?id=com.whatsapp"; // fallback store link - const handleSend = (contact: any) => { - setSelectedContact(contact); - setModalVisible(true); - }; + const handleSend = async (contact: any) => { + if (!contact) return; - const renderContact = ({ item }: { item: any }) => ( - - - - {item.name ? item.name.charAt(0).toUpperCase() : "?"} - - - - {item.name} - {item.phone} - - handleSend(item)} - > - Invite - - - ); + const message = `Hey ${contact.name}, check out this awesome app! Download here: ${APP_URL}`; - return ( - - Select Contact - index.toString()} - renderItem={renderContact} - /> + // direct send to contact if you want + const url = `whatsapp://send?phone=${contact.phone}&text=${encodeURIComponent( + message + )}`; - {/* Send Modal */} - setModalVisible(false)} - > - - - Send Invite - {selectedContact && ( - - Send invite to {selectedContact.name} ({selectedContact.phone})? - - )} - - setModalVisible(false)} - > - Cancel - - setModalVisible(false)} - > - Send - + try { + const supported = await Linking.canOpenURL("whatsapp://send"); + if (supported) { + // WhatsApp installed + await Linking.openURL(url); + } else { + // WhatsApp not installed → send user to Play Store/App Store + if (Platform.OS === "android") { + await Linking.openURL(WHATSAPP_URL); + } else if (Platform.OS === "ios") { + await Linking.openURL("itms-apps://apps.apple.com/app/whatsapp-messenger/id310633997"); + } + } + } catch (err) { + console.error("Error sending to WhatsApp:", err); + Alert.alert("Error", "Something went wrong while trying to open WhatsApp"); + } + + setModalVisible(false); + }; + + + const renderContact = ({ item }: { item: any }) => ( + + + + {item.name ? item.name.charAt(0).toUpperCase() : "?"} + - + + {item.name} + {item.phone} + + { + setSelectedContact(item); + setModalVisible(true); + }} + > + Invite + - - - ); + ); + + return ( + + + Select Contact + + + + index.toString()} + renderItem={renderContact} + /> + + {/* Send Modal */} + setModalVisible(false)} + > + + + Send Invite + {selectedContact && ( + + Send invite to {selectedContact.name} ({selectedContact.phone}) + + )} + + setModalVisible(false)} + > + Cancel + + handleSend(selectedContact)} + > + Send + + + + + + + ); }; + export default YourContacts; const styles = StyleSheet.create({ - container: { - flex: 1, - backgroundColor: "#fff", - paddingHorizontal: 10, - paddingTop: 20, - }, - header: { - fontSize: 20, - fontWeight: "bold", - marginBottom: 15, - }, - contactRow: { - flexDirection: "row", - alignItems: "center", - paddingVertical: 12, - borderBottomWidth: 0.5, - borderBottomColor: "#ddd", - }, - avatar: { - width: 45, - height: 45, - borderRadius: 25, - backgroundColor: "#25D366", - justifyContent: "center", - alignItems: "center", - marginRight: 12, - }, - avatarText: { - color: "#fff", - fontSize: 18, - fontWeight: "bold", - }, - contactInfo: { - flex: 1, - }, - contactName: { - fontSize: 16, - fontWeight: "600", - }, - contactPhone: { - fontSize: 13, - color: "gray", - }, - inviteButton: { - paddingHorizontal: 14, - paddingVertical: 6, - borderRadius: 8, - borderWidth: 1, - borderColor: "#25D366", - }, - inviteText: { - color: "#25D366", - fontWeight: "bold", - }, - modalOverlay: { - flex: 1, - backgroundColor: "rgba(0,0,0,0.5)", - justifyContent: "center", - alignItems: "center", - }, - modalContent: { - width: "80%", - backgroundColor: "#fff", - borderRadius: 10, - padding: 20, - alignItems: "center", - }, - modalTitle: { - fontSize: 18, - fontWeight: "bold", - marginBottom: 10, - }, - modalText: { - fontSize: 15, - marginBottom: 20, - textAlign: "center", - }, - modalActions: { - flexDirection: "row", - justifyContent: "space-between", - width: "100%", - }, - cancelButton: { - flex: 1, - marginRight: 10, - paddingVertical: 10, - borderRadius: 8, - backgroundColor: "#ddd", - alignItems: "center", - }, - cancelText: { - fontWeight: "bold", - color: "#333", - }, - sendButton: { - flex: 1, - marginLeft: 10, - paddingVertical: 10, - borderRadius: 8, - backgroundColor: "#25D366", - alignItems: "center", - }, - sendText: { - fontWeight: "bold", - color: "#fff", - }, + container: { + flex: 1, + backgroundColor: "#fff", + paddingHorizontal: 10, + paddingTop: 20, + }, + header: { + fontSize: 20, + fontWeight: "bold", + marginBottom: 15, + }, + contactRow: { + flexDirection: "row", + alignItems: "center", + paddingVertical: 12, + borderBottomWidth: 0.5, + borderBottomColor: "#ddd", + }, + avatar: { + width: 45, + height: 45, + borderRadius: 25, + backgroundColor: "#25D366", + justifyContent: "center", + alignItems: "center", + marginRight: 12, + }, + avatarText: { + color: "#fff", + fontSize: 18, + fontWeight: "bold", + }, + contactInfo: { + flex: 1, + }, + contactName: { + fontSize: 16, + fontWeight: "600", + }, + contactPhone: { + fontSize: 13, + color: "gray", + }, + inviteButton: { + paddingHorizontal: 14, + paddingVertical: 6, + borderRadius: 8, + borderWidth: 1, + borderColor: "#25D366", + }, + inviteText: { + color: "#25D366", + fontWeight: "bold", + }, + modalOverlay: { + flex: 1, + backgroundColor: "rgba(0,0,0,0.5)", + justifyContent: "center", + alignItems: "center", + }, + modalContent: { + width: "80%", + backgroundColor: "#fff", + borderRadius: 10, + padding: 20, + alignItems: "center", + }, + modalTitle: { + fontSize: 18, + fontWeight: "bold", + marginBottom: 10, + }, + modalText: { + fontSize: 15, + marginBottom: 20, + textAlign: "center", + }, + modalActions: { + flexDirection: "row", + justifyContent: "space-between", + width: "100%", + }, + cancelButton: { + flex: 1, + marginRight: 10, + paddingVertical: 10, + borderRadius: 8, + backgroundColor: "#ddd", + alignItems: "center", + }, + cancelText: { + fontWeight: "bold", + color: "#333", + }, + sendButton: { + flex: 1, + marginLeft: 10, + paddingVertical: 10, + borderRadius: 8, + backgroundColor: "#25D366", + alignItems: "center", + }, + sendText: { + fontWeight: "bold", + color: "#fff", + }, }); diff --git a/src/screens/profile/Profile.tsx b/src/screens/profile/Profile.tsx index 87b24db..5a4bbd8 100644 --- a/src/screens/profile/Profile.tsx +++ b/src/screens/profile/Profile.tsx @@ -332,11 +332,28 @@ const Profile = () => { {/* Profile Card */} {/* Profile Image Section */} - { - statusData?.role && statusData?.organizerStatus ? - Your Role: {statusData.role} | Organizer Status: {statusData.organizerStatus} - : - } + { + statusData?.role === "USER" && statusData?.organizerStatus !== "NOT_APPLIED" ? ( + + Your Role: {statusData.role} | Organizer Status: {statusData.organizerStatus} + + ) : ( + statusData?.role !== "ORGANIZER" && ( + + ) + ) + } + = ({ role, status }) => { if (newValue) { navigation.navigate("BecomeOrg"); // Navigate when ON - setTimeout(() => { - setIsEnabled(false); - }, 2000); - // Reset switch to OFF after navigation } else { navigation.navigate("Profile"); // Navigate when OFF } @@ -40,18 +35,17 @@ const SwitchNavigator: React.FC = ({ role, status }) => { return ( - {!isEnabled && role !== "USER" + {!isEnabled && role !== "USER" ? "Become an Organizer" : `Request Organizer Role ${status}`} - {role !== "USER" ? ( - ) : } + ); };