import { Avatar, Button, Card, Colors, Dialog, Image, KeyboardAwareScrollView, PanningProvider, Picker, Text, TextField, TextFieldRef, TouchableOpacity, View, } from "react-native-ui-lib"; import React, {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 {ImagePickerAsset} from "expo-image-picker"; 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 [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} = useGetFamilyMembers(true); const {user} = useAuthContext(); const {pickImage, changeProfilePicture, handleClearImage, pfpUri, profileImageAsset} = useUploadProfilePicture(newUserId) 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`, 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(""); }, []); // @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} userId={member?.uid!} /> ))} )} {!!caregivers.length && ( Caregivers {caregivers?.map((member) => ( {member.firstName} {member.lastName} Caregiver setShowQRCodeDialog(val)} showQRCodeDialog={showQRCodeDialog === member?.uid} userId={member?.uid!} /> ))} )} {!!familyDevices.length && ( <> Family Devices {familyDevices?.map((member, index) => ( {member.firstName} Family Device setShowQRCodeDialog(val)} showQRCodeDialog={showQRCodeDialog === member?.uid} userId={member?.uid!} /> ))} )} 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" /> )} {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}, userType: { fontFamily: "Manrope_500Medium", fontSize: 12, color: "#858585", }, name: { fontFamily: "Manrope_600SemiBold", fontSize: 16, }, }); export default MyGroup;