From 2d6b0ecfe98ed32e439c78f8dec18b3fa0b7bf06 Mon Sep 17 00:00:00 2001 From: Evan Hahn <69474926+EvanHahn-Signal@users.noreply.github.com> Date: Fri, 4 Jun 2021 09:55:34 -0500 Subject: [PATCH] Edit group title/description: fix focus issues --- .../ConversationDetails.tsx | 4 ++- ...ditConversationAttributesModal.stories.tsx | 7 +++++ .../EditConversationAttributesModal.tsx | 26 ++++++++++++------- ts/util/lint/exceptions.json | 8 ++++++ 4 files changed, 34 insertions(+), 11 deletions(-) diff --git a/ts/components/conversation/conversation-details/ConversationDetails.tsx b/ts/components/conversation/conversation-details/ConversationDetails.tsx index 9c9037aa6..a9a539795 100644 --- a/ts/components/conversation/conversation-details/ConversationDetails.tsx +++ b/ts/components/conversation/conversation-details/ConversationDetails.tsx @@ -148,9 +148,11 @@ export const ConversationDetails: React.ComponentType = ({ modalNode = ( ; const createProps = (overrideProps: Partial = {}): PropsType => ({ avatarPath: undefined, i18n, + initiallyFocusDescription: false, onClose: action('onClose'), makeRequest: action('onMakeRequest'), requestState: RequestState.Inactive, @@ -42,6 +43,12 @@ story.add('Avatar and title', () => ( /> )); +story.add('Initially focusing description', () => ( + +)); + story.add('Request active', () => ( = ({ avatarPath: externalAvatarPath, - focusDescription = false, groupDescription: externalGroupDescription = '', i18n, + initiallyFocusDescription, makeRequest, onClose, requestState, title: externalTitle, }) => { + const focusDescriptionRef = useRef( + initiallyFocusDescription + ); + const focusDescription = focusDescriptionRef.current; + const startingTitleRef = useRef(externalTitle); const startingAvatarPathRef = useRef(externalAvatarPath); @@ -71,6 +70,13 @@ export const EditConversationAttributesModal: FunctionComponent = ({ const trimmedTitle = rawTitle.trim(); const trimmedDescription = rawGroupDescription.trim(); + const focusRef = (el: null | HTMLElement) => { + if (el) { + el.focus(); + focusDescriptionRef.current = undefined; + } + }; + useEffect(() => { const startingAvatarPath = startingAvatarPathRef.current; if (!startingAvatarPath) { @@ -164,7 +170,7 @@ export const EditConversationAttributesModal: FunctionComponent = ({ disabled={isRequestActive} i18n={i18n} onChangeValue={setRawTitle} - ref={!focusDescription ? focusRef : undefined} + ref={focusDescription === false ? focusRef : undefined} value={rawTitle} /> @@ -172,7 +178,7 @@ export const EditConversationAttributesModal: FunctionComponent = ({ disabled={isRequestActive} i18n={i18n} onChangeValue={setRawGroupDescription} - ref={focusDescription ? focusRef : undefined} + ref={focusDescription === true ? focusRef : undefined} value={rawGroupDescription} /> diff --git a/ts/util/lint/exceptions.json b/ts/util/lint/exceptions.json index a4d994d5a..93dbe89e8 100644 --- a/ts/util/lint/exceptions.json +++ b/ts/util/lint/exceptions.json @@ -14123,6 +14123,14 @@ "updated": "2021-03-05T22:52:40.572Z", "reasonDetail": "Doesn't interact with the DOM." }, + { + "rule": "React-useRef", + "path": "ts/components/conversation/conversation-details/EditConversationAttributesModal.js", + "line": " const focusDescriptionRef = react_1.useRef(initiallyFocusDescription);", + "reasonCategory": "usageTrusted", + "updated": "2021-06-04T14:19:49.714Z", + "reasonDetail": "Only stores undefined/true/false, not DOM references." + }, { "rule": "React-createRef", "path": "ts/components/conversation/media-gallery/MediaGallery.js",