From 7eb8ccae48b0cc18a9dcaa9c3626a02df8e6d919 Mon Sep 17 00:00:00 2001 From: JustZvan Date: Fri, 6 Feb 2026 13:22:33 +0100 Subject: feat: initial commit! --- app/(tabs)/settings.tsx | 221 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 221 insertions(+) create mode 100644 app/(tabs)/settings.tsx (limited to 'app/(tabs)/settings.tsx') diff --git a/app/(tabs)/settings.tsx b/app/(tabs)/settings.tsx new file mode 100644 index 0000000..b4493b4 --- /dev/null +++ b/app/(tabs)/settings.tsx @@ -0,0 +1,221 @@ +import { Ionicons } from "@expo/vector-icons"; +import { useEffect, useState } from "react"; +import { View } from "react-native"; +import { + Device, + getDevices, + getUserProfile, + 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 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); + }; + + return ( + + setAlertVisible(false)} + /> + + setRenameVisible(false)} + onSubmit={handleRename} + initialValue={selectedDevice?.name} + /> + + setVerifyEmailVisible(false)} + onSubmit={handleVerifyEmail} + initialValue="" + /> + + + setVerifyEmailResult({ ...verifyEmailResult, 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={ + + } + /> + + )} +