From 2cfcc26c8b4272e4ff08deeea89a2c7f941bda27 Mon Sep 17 00:00:00 2001 From: Kerry Archibald Date: Wed, 13 Sep 2023 15:37:18 +1200 Subject: [PATCH] UserName: switch to controlled input, disable save button when no changes --- .../src/components/UserProfile/UserName.tsx | 30 +++++++++++-------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/frontend/src/components/UserProfile/UserName.tsx b/frontend/src/components/UserProfile/UserName.tsx index a70105a63..5d15d72f8 100644 --- a/frontend/src/components/UserProfile/UserName.tsx +++ b/frontend/src/components/UserProfile/UserName.tsx @@ -23,7 +23,7 @@ import { import { useAtomValue, useAtom, useSetAtom, atom } from "jotai"; import { atomFamily } from "jotai/utils"; import { atomWithMutation } from "jotai-urql"; -import { useState, useEffect, useRef } from "react"; +import { useState, useEffect, ChangeEventHandler } from "react"; import { graphql } from "../../gql"; import LoadingSpinner from "../LoadingSpinner/LoadingSpinner"; @@ -72,7 +72,6 @@ const getErrorMessage = (result: { const UserName: React.FC<{ userId: string }> = ({ userId }) => { const result = useAtomValue(userGreetingFamily(userId)); - const fieldRef = useRef(null); const [setDisplayNameResult, setDisplayName] = useAtom( setDisplayNameFamily(userId), @@ -81,20 +80,24 @@ const UserName: React.FC<{ userId: string }> = ({ userId }) => { const user = result.data?.user; const displayName = user?.matrix.displayName || ""; + const [fieldValue, setFieldValue] = useState(displayName); const userGreeting = useSetAtom(userGreetingFamily(userId)); useEffect(() => { - if (fieldRef.current) { - fieldRef.current.value = displayName; - } + setFieldValue(displayName); }, [displayName]); + const hasChanges = fieldValue !== displayName; + + const onChange: ChangeEventHandler = (event): void => { + setFieldValue(event.target.value); + }; + const onSubmit = (event: React.FormEvent): void => { event.preventDefault(); - const formData = new FormData(event.currentTarget); - let newDisplayName = (formData.get("displayname") as string) || null; + let newDisplayName = fieldValue || null; // set null to remove an existing username if (newDisplayName === "") { @@ -117,9 +120,7 @@ const UserName: React.FC<{ userId: string }> = ({ userId }) => { }); } else if (result.data.setDisplayName.status === "INVALID") { // reset to current saved display name - if (fieldRef.current) { - fieldRef.current.value = displayName; - } + setFieldValue(displayName); } setInProgress(false); }); @@ -131,7 +132,12 @@ const UserName: React.FC<{ userId: string }> = ({ userId }) => { - + {!inProgress && errorMessage && ( @@ -141,7 +147,7 @@ const UserName: React.FC<{ userId: string }> = ({ userId }) => {