import { useState } from "react"; import Form from "@moduletrace/twui/form/Form"; import Row from "@moduletrace/twui/layout/Row"; import _ from "lodash"; import useFormInit from "@/src/hooks/use-form-init"; import type { UserFormObject } from "@/src/types"; import type { BUN_SQLITE_COBBLE_USERS_JOIN } from "@/src/types/sql-joins"; import grabMediaURL from "@/src/functions/backend/media/grab-media-url"; import SettingsGroup from "../../(partials)/settings-group"; import SettingsSaveBar from "../../(partials)/settings-save-bar"; import { ProfileFields } from "../(data)/profile-fields"; import isProfileDirty from "../(utils)/is-profile-dirty"; import submitProfileForm from "../(functions)/submit-profile-form"; import ProfilePhotoField from "./profile-photo-field"; import ProfileTextField from "./profile-text-field"; import ProfileRoleRow from "./profile-role-row"; type Props = { person: BUN_SQLITE_COBBLE_USERS_JOIN; }; export default function ProfileForm({ person }: Props) { const [saved, setSaved] = useState( () => _.pick(person, ProfileFields) as UserFormObject, ); const [saved_photo_src, setSavedPhotoSrc] = useState(() => person.profile_media_id ? grabMediaURL({ media: { id: person.profile_media_id } }).media_url : undefined, ); /** * Inputs are uncontrolled; bumping this remounts them on Discard. */ const [form_key, setFormKey] = useState(0); const [notice, setNotice] = useState(); const init = useFormInit({ existing: saved, existing_full: { id: person.id }, }); const { form, setForm, image, setImage, loading, status, setStatus } = init; const dirty = isProfileDirty({ form, existing: saved, image }); const initials = [saved.first_name, saved.last_name] .filter(Boolean) .map((part) => String(part).charAt(0).toUpperCase()) .join(""); const discard = () => { setForm(saved); setImage(undefined); setStatus({}); setNotice(undefined); setFormKey((prev) => prev + 1); }; return (
{ if (!dirty || loading) return; if (!window.confirm(`Save your profile?`)) return; submitProfileForm({ ...init, onSaved: ({ saved, photo_src, msg }) => { setSaved(saved); setImage(undefined); if (photo_src) setSavedPhotoSrc(photo_src); setNotice(msg); window.location.reload(); }, }); }} > { setStatus({}); setImage(next); }} disabled={loading} /> ); }