import { Avatar, Button, Card, Colors, Dialog, FloatingButton, KeyboardAwareScrollView, PanningProvider, Picker, Text, TextField, TextFieldRef, TouchableOpacity, View, } from "react-native-ui-lib"; import React, {useEffect, useRef, useState} from "react"; import {ScrollView, StyleSheet} from "react-native"; import {PickerSingleValue} from "react-native-ui-lib/src/components/picker/types"; import {useCreateSubUser} from "@/hooks/firebase/useCreateSubUser"; import {ProfileType} 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 {PreviousNextView} from "react-native-keyboard-manager"; const MyGroup = () => { const [showAddUserDialog, setShowAddUserDialog] = useState(false); const [showNewUserInfoDialog, setShowNewUserInfoDialog] = useState(false); const [selectedStatus, setSelectedStatus] = useState< string | PickerSingleValue >(ProfileType.CHILD); const [firstName, setFirstName] = useState(""); const [lastName, setLastName] = useState(""); const [email, setEmail] = useState(""); const lNameRef = useRef(null); const emailRef = useRef(null); const [showQRCodeDialog, setShowQRCodeDialog] = useState(""); const {mutateAsync: createSubUser, isLoading, isError} = useCreateSubUser(); const {data: familyMembers} = useGetFamilyMembers(true); 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) { setShowNewUserInfoDialog(false); if (res?.data?.userId) { setTimeout(() => { setShowQRCodeDialog(res.data.userId); }, 500); } } }; 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.firstName} {member.lastName} {member.userType === ProfileType.PARENT ? "Admin (You)" : "Child"} setShowQRCodeDialog("")} showQRCodeDialog={showQRCodeDialog === member?.uid} userId={member?.uid!} /> ))} )} {!!caregivers.length && ( <> Caregivers {caregivers?.map((member) => ( {member.firstName} {member.lastName} Caregiver setShowQRCodeDialog("")} showQRCodeDialog={showQRCodeDialog === member?.uid} userId={member?.uid!} /> ))} )} {!!familyDevices.length && ( <> Family Devices {familyDevices?.map((member, index) => ( {member.firstName} Family Device setShowQRCodeDialog("")} showQRCodeDialog={showQRCodeDialog === member?.uid} userId={member?.uid!} /> ))} )} setShowAddUserDialog(true), style: styles.bottomButton, }} /> setShowAddUserDialog(false)} panDirection={PanningProvider.Directions.DOWN} > Add a new user device setShowAddUserDialog(false)} center marginT-30 > Return to user settings setShowNewUserInfoDialog(false)} > New User Information { setShowNewUserInfoDialog(false) }}> } 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"} { 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: 15, padding: 20, }, bottomButton: { position: "absolute", bottom: 80, 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, }, }); export default MyGroup;