Signed-off-by: OpenClaw Bot <ai-agent@topdoglabs.com>

This commit is contained in:
OpenClaw Bot 2026-02-21 12:59:22 -06:00
parent 82658707a2
commit 7c1b9d578c

View File

@ -47,19 +47,29 @@ export default function SettingsPage() {
if (isMounted) router.replace("/login") if (isMounted) router.replace("/login")
return return
} }
const data = await res.json() const data = await res.json().catch(() => null)
const user = data?.user
if (
!user
|| typeof user.id !== "string"
|| typeof user.name !== "string"
|| typeof user.email !== "string"
) {
if (isMounted) router.replace("/login")
return
}
if (!isMounted) return if (!isMounted) return
setName(data.user.name || "") setName(user.name || "")
setEmail(data.user.email || "") setEmail(user.email || "")
setProfileAvatarUrl(data.user.avatarUrl || "") setProfileAvatarUrl(typeof user.avatarUrl === "string" ? user.avatarUrl : "")
setCurrentUserId(data.user.id || "") setCurrentUserId(user.id || "")
setInitialEmail(data.user.email || "") setInitialEmail(user.email || "")
setCurrentUser({ setCurrentUser({
id: data.user.id, id: user.id,
name: data.user.name, name: user.name,
email: data.user.email, email: user.email,
avatarUrl: data.user.avatarUrl, avatarUrl: typeof user.avatarUrl === "string" ? user.avatarUrl : undefined,
}) })
setAuthReady(true) setAuthReady(true)
} catch { } catch {
@ -111,23 +121,35 @@ export default function SettingsPage() {
body: JSON.stringify(payload), body: JSON.stringify(payload),
}) })
const data = await res.json() const data = await res.json().catch(() => null)
if (!res.ok) { if (!res.ok) {
setProfileError(data.error || "Failed to update profile") setProfileError(
data && typeof data.error === "string" ? data.error : "Failed to update profile"
)
return
}
const user = data?.user
if (
!user
|| typeof user.id !== "string"
|| typeof user.name !== "string"
|| typeof user.email !== "string"
) {
setProfileError("Profile update returned invalid data")
return return
} }
setCurrentUser({ setCurrentUser({
id: data.user.id, id: user.id,
name: data.user.name, name: user.name,
email: data.user.email, email: user.email,
avatarUrl: data.user.avatarUrl, avatarUrl: typeof user.avatarUrl === "string" ? user.avatarUrl : undefined,
}) })
setName(data.user.name) setName(user.name)
setEmail(data.user.email) setEmail(user.email)
setProfileAvatarUrl(data.user.avatarUrl || "") setProfileAvatarUrl(typeof user.avatarUrl === "string" ? user.avatarUrl : "")
setCurrentUserId(data.user.id) setCurrentUserId(user.id)
setInitialEmail(data.user.email) setInitialEmail(user.email)
setProfileCurrentPassword("") setProfileCurrentPassword("")
setProfileSuccess("Profile updated") setProfileSuccess("Profile updated")
} catch { } catch {
@ -161,7 +183,7 @@ export default function SettingsPage() {
[avatarSeed, name, email] [avatarSeed, name, email]
) )
const avatarPresets = useMemo( const avatarPresets = useMemo(
() => buildAvatarPresets(avatarSeed, name || email || "User", 8), () => Array.from(new Set(buildAvatarPresets(avatarSeed, name || email || "User", 8))),
[avatarSeed, name, email] [avatarSeed, name, email]
) )
const profilePreviewAvatarUrl = profileAvatarUrl || generatedAvatarUrl const profilePreviewAvatarUrl = profileAvatarUrl || generatedAvatarUrl
@ -194,9 +216,11 @@ export default function SettingsPage() {
}), }),
}) })
const data = await res.json() const data = await res.json().catch(() => null)
if (!res.ok) { if (!res.ok) {
setPasswordError(data.error || "Failed to update password") setPasswordError(
data && typeof data.error === "string" ? data.error : "Failed to update password"
)
return return
} }
@ -295,7 +319,7 @@ export default function SettingsPage() {
<div className="flex flex-wrap gap-2"> <div className="flex flex-wrap gap-2">
{avatarPresets.map((presetUrl, index) => ( {avatarPresets.map((presetUrl, index) => (
<button <button
key={presetUrl} key={`${avatarSeed}-preset-${index}`}
type="button" type="button"
onClick={() => setProfileAvatarUrl(presetUrl)} onClick={() => setProfileAvatarUrl(presetUrl)}
className={`rounded-full p-0.5 border ${profileAvatarUrl === presetUrl ? "border-blue-400" : "border-slate-700 hover:border-slate-500"}`} className={`rounded-full p-0.5 border ${profileAvatarUrl === presetUrl ? "border-blue-400" : "border-slate-700 hover:border-slate-500"}`}