import { useState, useEffect } from "react"; import { useStore } from "@nanostores/react"; import { userNameSchema } from "@tomodachi-share/shared/schemas"; import ProfilePictureSettings from "./profile-picture"; import SubmitDialogButton from "./submit-dialog-button"; import DeleteAccount from "./delete-account"; import z from "zod"; import { useNavigate } from "react-router"; import { session } from "../../session"; import { type Theme, applyTheme } from "../../lib/theme"; interface Props { currentDescription: string | null | undefined; } export default function ProfileSettings({ currentDescription }: Props) { const navigate = useNavigate(); const $session = useStore(session); const [description, setDescription] = useState(currentDescription); const [name, setName] = useState(""); const [selectedTheme, setSelectedTheme] = useState("SYSTEM"); const [themeSaveError, setThemeSaveError] = useState(undefined); const [descriptionChangeError, setDescriptionChangeError] = useState(undefined); const [nameChangeError, setNameChangeError] = useState(undefined); // Initialize theme from session when it loads useEffect(() => { if ($session?.user?.theme) { setSelectedTheme($session.user.theme); } }, [$session?.user?.theme]); const handleSubmitDescriptionChange = async (close: () => void) => { const parsed = z.string().trim().max(256).safeParse(description); if (!parsed.success) { setDescriptionChangeError(parsed.error.issues[0].message); return; } const response = await fetch(`${import.meta.env.VITE_API_URL}/api/auth/about-me`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ description }), credentials: "include", }); if (!response.ok) { const { error } = await response.json(); setDescriptionChangeError(error); return; } close(); navigate(0); }; const handleSubmitNameChange = async (close: () => void) => { const parsed = userNameSchema.safeParse(name); if (!parsed.success) { setNameChangeError(parsed.error.issues[0].message); return; } const response = await fetch(`${import.meta.env.VITE_API_URL}/api/auth/name`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ name }), credentials: "include", }); if (!response.ok) { const { error } = await response.json(); setNameChangeError(error); return; } close(); navigate(0); }; const handleThemeSave = async (close: () => void) => { const response = await fetch(`${import.meta.env.VITE_API_URL}/api/auth/theme`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ theme: selectedTheme }), credentials: "include", }); if (!response.ok) { const { error } = await response.json(); setThemeSaveError(error); return; } // Apply the theme immediately applyTheme(selectedTheme); close(); navigate(0); }; return (

Settings

Update your account info, username, and site-wide theme.

{/* Separator */}

Account Info
{/* Profile Picture */}
{/* Description */}

Write about yourself on your profile