import { Ionicons } from "@expo/vector-icons"; import { useEffect, useState } from "react"; import { View } from "react-native"; import { Device, getDevices, getUserProfile, requestKidLinkCode, renameDevice, UserProfile, verifyEmail, } from "../../api"; import { useAuth } from "../../lib/auth"; import { t } from "../../lib/locales"; import { colors } from "../../lib/theme"; import { ActionRow, AlertDialog, Button, Card, Divider, H2, Pill, PromptDialog, Row, Screen, } from "../../lib/ui"; export default function SettingsScreen() { const { signOut } = useAuth(); const [devices, setDevices] = useState([]); const [profile, setProfile] = useState(null); const [alertVisible, setAlertVisible] = useState(false); const [renameVisible, setRenameVisible] = useState(false); const [selectedDevice, setSelectedDevice] = useState(null); const [verifyEmailVisible, setVerifyEmailVisible] = useState(false); const [verifyEmailResult, setVerifyEmailResult] = useState<{ visible: boolean; success: boolean; message: string; }>({ visible: false, success: false, message: "" }); const [kidLinkCodeResult, setKidLinkCodeResult] = useState<{ visible: boolean; success: boolean; title: string; message: string; }>({ visible: false, success: false, title: "", message: "" }); const showNotWired = () => setAlertVisible(true); const refreshDevices = () => { getDevices().then(setDevices); }; const refreshProfile = () => { getUserProfile().then(setProfile); }; useEffect(() => { refreshDevices(); refreshProfile(); }, []); const handleRename = async (newName: string) => { if (selectedDevice && newName) { const success = await renameDevice(selectedDevice.id, newName); if (success) { refreshDevices(); } } setRenameVisible(false); setSelectedDevice(null); }; const handleVerifyEmail = async (code: string) => { if (code) { const result = await verifyEmail(code); if (result.success) { setVerifyEmailResult({ visible: true, success: true, message: t("emailVerifiedSuccessfully"), }); refreshProfile(); } else { setVerifyEmailResult({ visible: true, success: false, message: result.error || t("failedToVerifyEmail"), }); } } setVerifyEmailVisible(false); }; const handleGenerateKidLinkCode = async () => { const result = await requestKidLinkCode(); if (result.success && result.code) { const expiresMinutes = Math.max( 1, Math.ceil((result.expiresInSeconds ?? 300) / 60), ); setKidLinkCodeResult({ visible: true, success: true, title: t("kidLinkCodeTitle"), message: `${result.code}\n${t("kidLinkCodeExpiresIn")} ${expiresMinutes} min`, }); return; } setKidLinkCodeResult({ visible: true, success: false, title: t("error"), message: result.error || t("failedToGenerateKidLinkCode"), }); }; return ( setAlertVisible(false)} /> setRenameVisible(false)} onSubmit={handleRename} initialValue={selectedDevice?.name} /> setVerifyEmailVisible(false)} onSubmit={handleVerifyEmail} initialValue="" /> setVerifyEmailResult({ ...verifyEmailResult, visible: false }) } /> setKidLinkCodeResult({ ...kidLinkCodeResult, visible: false }) } />

{t("devices")}

} right={ } /> {devices.map((device, index) => ( { setSelectedDevice(device); setRenameVisible(true); }} right={ } /> {index !== devices.length - 1 && } ))}

{t("transparency")}

} />

{t("account")}

} /> {profile && !profile.emailVerified && ( <> setVerifyEmailVisible(true)} right={ } /> )}