import { Avatar, Button, Card, Colors, DateTimePicker, Dialog, Image, KeyboardAwareScrollView, PanningProvider, Picker, Text, TextField, TextFieldRef, TouchableOpacity, View, } from "react-native-ui-lib"; import React, { useCallback, useEffect, useRef, useState } from "react"; import { ImageBackground, Platform, StyleSheet } from "react-native"; import { PickerSingleValue } from "react-native-ui-lib/src/components/picker/types"; import { useCreateSubUser } from "@/hooks/firebase/useCreateSubUser"; import { ProfileType, useAuthContext } from "@/contexts/AuthContext"; import { useGetFamilyMembers } from "@/hooks/firebase/useGetFamilyMembers"; import UserMenu from "@/components/pages/settings/user_settings_views/UserMenu"; import { uuidv4 } from "@firebase/util"; import QRIcon from "@/assets/svgs/QRIcon"; import EmailIcon from "@/assets/svgs/EmailIcon"; 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 KeyboardManager, { PreviousNextView, } from "react-native-keyboard-manager"; import { ScrollView } from "react-native-gesture-handler"; import { useUploadProfilePicture } from "@/hooks/useUploadProfilePicture"; import UserOptions from "./UserOptions"; import { colorMap } from "@/constants/colorMap"; import { useFocusEffect } from "@react-navigation/core"; type MyGroupProps = { onNewUserClick: boolean; setOnNewUserClick: React.Dispatch>; }; const MyGroup: React.FC = ({ onNewUserClick, setOnNewUserClick, }) => { const [showAddUserDialog, setShowAddUserDialog] = useState(false); const [selectedStatus, setSelectedStatus] = useState< string | PickerSingleValue >(ProfileType.CHILD); const [firstName, setFirstName] = useState(""); const [lastName, setLastName] = useState(""); const [email, setEmail] = useState(""); const [birthday, setBirthday] = useState(() => { const date = new Date(); date.setFullYear(date.getFullYear() - 3); return date; }); const { profileData } = useAuthContext(); const [newUserId, setNewUserId] = useState(""); const lNameRef = useRef(null); const emailRef = useRef(null); const [showQRCodeDialog, setShowQRCodeDialog] = useState( false ); const { mutateAsync: createSubUser, isLoading, isError } = useCreateSubUser(); const { data: familyMembers, refetch: refetchFamilyMembers } = useGetFamilyMembers(true); const { user } = useAuthContext(); const { pickImage, changeProfilePicture, handleClearImage, pfpUri, profileImageAsset, } = useUploadProfilePicture(newUserId); useFocusEffect( useCallback(() => { refetchFamilyMembers(); }, [refetchFamilyMembers]) ); const parents = familyMembers?.filter((x) => x.userType === ProfileType.PARENT) ?? []; const children = familyMembers?.filter((x) => x.userType === ProfileType.CHILD) ?? []; const caregivers = familyMembers?.filter((x) => x.userType === ProfileType.CAREGIVER) ?? []; const familyDevices = familyMembers?.filter((x) => x.userType === ProfileType.FAMILY_DEVICE) ?? []; const handleCreateSubUser = async () => { if ( !firstName || (selectedStatus !== ProfileType.FAMILY_DEVICE && !lastName) ) { console.error("First name and last name are required"); return; } // if (selectedStatus !== ProfileType.FAMILY_DEVICE && !email) { // console.error("Email is required for non-family device users"); // return; // } if (email && !email.includes("@")) { console.error("Invalid email address"); return; } const res = await createSubUser({ firstName, lastName: selectedStatus === ProfileType.FAMILY_DEVICE ? "" : lastName, email: email || `placeholder_${uuidv4().split("-")[0]}@family.device`, birthday: birthday, password: uuidv4(), userType: selectedStatus as ProfileType, }); console.log(res); if (!isError) { setOnNewUserClick(false); if (res?.data?.userId) { if (profileImageAsset) { await changeProfilePicture(profileImageAsset); setShowQRCodeDialog(res.data.userId); } else { setTimeout(() => { setShowQRCodeDialog(res.data.userId); }, 500); } handleClearImage(); } } }; useEffect(() => { if (Platform.OS === "ios") KeyboardManager.setEnableAutoToolbar(true); }, []); useEffect(() => { setFirstName(""); setLastName(""); setEmail(""); const date = new Date(); date.setFullYear(date.getFullYear() - 3); setBirthday(date); }, []); const getMaxDate = () => { const date = new Date(); date.setFullYear(date.getFullYear() - 3); // Minimum age: 3 years return date; }; const getMinDate = () => { const date = new Date(); date.setFullYear(date.getFullYear() - 18); // Maximum age: 18 years return date; }; // @ts-ignore return ( {!parents.length && !children.length && !caregivers.length && ( {isLoading ? "Loading...." : "No user devices added"} )} {(!!parents.length || !!children.length) && ( Family {[...parents, ...children]?.map((member, index) => ( {member.pfp ? ( ) : ( )} {member.firstName} {member.lastName} {member.userType === ProfileType.PARENT ? `Admin${member.uid === user?.uid ? " (You)" : ""}` : "Child"} setShowQRCodeDialog(val)} showQRCodeDialog={showQRCodeDialog === member?.uid} user={member} /> {profileData?.userType === ProfileType.PARENT && user?.uid != member.uid && } ))} )} {!!caregivers.length && ( Caregivers {caregivers?.map((member) => ( {member.pfp ? ( ) : ( )} {member.firstName} {member.lastName} Caregiver setShowQRCodeDialog(val)} showQRCodeDialog={showQRCodeDialog === member?.uid} user={member} /> {profileData?.userType === ProfileType.PARENT && ( )} ))} )} {!!familyDevices.length && ( Family Devices {familyDevices?.map((member, index) => ( {member.pfp ? ( ) : ( )} {member.firstName} Family Device setShowQRCodeDialog(val)} showQRCodeDialog={showQRCodeDialog === member?.uid} user={member} /> {profileData?.userType === ProfileType.PARENT && ( )} ))} )} setShowAddUserDialog(false)} panDirection={PanningProvider.Directions.DOWN} > Add a new user device setShowAddUserDialog(false)} center marginT-30 > Return to user settings setOnNewUserClick(false)} > New User Information { setOnNewUserClick(false); }} > {pfpUri ? ( ) : ( } backgroundColor={Colors.grey60} style={{ borderRadius: 25 }} center /> )} {pfpUri ? ( Clear user photo ) : ( Upload User Profile Photo )} Member Status setSelectedStatus(item)} showSearch floatingPlaceholder style={styles.inViewPicker} trailingAccessory={ } > {selectedStatus === ProfileType.FAMILY_DEVICE ? "Device Name" : "First Name"} { lNameRef.current?.focus(); }} blurOnSubmit={false} returnKeyType="next" /> {selectedStatus !== ProfileType.FAMILY_DEVICE && ( <> Last Name { emailRef.current?.focus(); }} blurOnSubmit={false} returnKeyType="next" /> Birthday {/* { if (date) { const validDate = new Date(date); if (!isNaN(validDate.getTime())) { setBirthday(validDate); console.log("Selected birthday:", validDate); } } }} />*/} )} {selectedStatus !== ProfileType.FAMILY_DEVICE && ( <> Email Address (Optional) )} ); }; const styles = StyleSheet.create({ dialogBtn: { height: 47, width: 279, }, dialogTitle: { fontFamily: "Manrope_600SemiBold", fontSize: 22 }, dialogBackBtn: { fontFamily: "PlusJakartaSans_500Medium", fontSize: 15, color: "#a7a7a7", }, card: { marginVertical: 15, backgroundColor: "white", width: "100%", borderRadius: 12, paddingHorizontal: 21, paddingVertical: 20, }, bottomButton: { position: "absolute", bottom: 50, backgroundColor: "#e8156c", width: "100%", }, familyCard: { marginBottom: 10, borderRadius: 10, backgroundColor: Colors.white, width: "100%", }, inputField: { fontFamily: "PlusJakartaSans_500Medium", fontSize: 13, color: "#565656", borderRadius: 50, paddingVertical: 12, paddingHorizontal: 16, backgroundColor: Colors.grey80, marginBottom: 16, borderColor: Colors.grey50, borderWidth: 1, height: 40, }, picker: { borderRadius: 50, paddingVertical: 12, paddingHorizontal: 16, backgroundColor: Colors.grey80, marginBottom: 16, borderColor: Colors.grey50, borderWidth: 1, marginTop: -20, height: 40, zIndex: 10, }, viewPicker: { borderRadius: 50, backgroundColor: Colors.grey80, marginBottom: 16, borderColor: Colors.grey50, borderWidth: 1, marginTop: 0, height: 40, zIndex: 10, }, inViewPicker: { borderRadius: 50, paddingVertical: 12, paddingHorizontal: 16, marginBottom: 16, marginTop: -20, height: 40, zIndex: 10, }, label: { marginBottom: 5, fontSize: 12, color: Colors.grey40, }, dialogCard: { borderRadius: 10, gap: 10, }, subTit: { fontFamily: "Manrope_500Medium", fontSize: 15, }, dialogBtnLbl: { fontFamily: "PlusJakartaSans_500Medium", fontSize: 15, color: "white", }, divider: { height: 0.7, backgroundColor: "#e6e6e6", width: "100%" }, jakarta12: { fontFamily: "PlusJakartaSans_500Medium", fontSize: 12, color: "#a1a1a1", }, jakarta13: { fontFamily: "PlusJakartaSans_500Medium", fontSize: 13, }, pfp: { aspectRatio: 1, width: 37.03, borderRadius: 10.56, overflow: "hidden", }, userType: { fontFamily: "Manrope_500Medium", fontSize: 12, color: "#858585", }, name: { fontFamily: "Manrope_600SemiBold", fontSize: 16, }, }); export default MyGroup;