diff --git a/frontend/js/src/common/listens/MBIDMappingModal.tsx b/frontend/js/src/common/listens/MBIDMappingModal.tsx index 4346ee13c8..809e741f43 100644 --- a/frontend/js/src/common/listens/MBIDMappingModal.tsx +++ b/frontend/js/src/common/listens/MBIDMappingModal.tsx @@ -48,6 +48,8 @@ export default NiceModal.create(({ listenToMap }: MBIDMappingModalProps) => { TrackMetadata >(); + const searchInputRef = React.useRef(null); + const closeModal = React.useCallback(() => { modal.hide(); document?.body?.classList?.remove("modal-open"); @@ -141,6 +143,8 @@ export default NiceModal.create(({ listenToMap }: MBIDMappingModalProps) => { setDefaultValue( `${getTrackName(listenToMap)} - ${getArtistName(listenToMap)}` ); + // Autofocus on the search input in order to automatically show list of results + searchInputRef?.current?.focus(); }, [listenToMap]); const listenFromSelectedRecording = getListenFromSelectedRecording( @@ -270,6 +274,7 @@ export default NiceModal.create(({ listenToMap }: MBIDMappingModalProps) => { ) : (
{ diff --git a/frontend/js/src/user/components/AddSingleListen.tsx b/frontend/js/src/user/components/AddSingleListen.tsx index 1fd0ce394a..dfefc4cf45 100644 --- a/frontend/js/src/user/components/AddSingleListen.tsx +++ b/frontend/js/src/user/components/AddSingleListen.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from "react"; +import React, { useEffect, useRef, useState } from "react"; import { faChevronDown, faTimesCircle, @@ -26,6 +26,8 @@ export default function AddSingleListen({ | undefined; }>({}); + const searchInputRef = useRef(null); + const removeRecording = (recordingMBID: string) => { setSelectedRecordings((prevRecordings) => prevRecordings.filter((rec) => rec.id !== recordingMBID) @@ -72,6 +74,7 @@ export default function AddSingleListen({ return (
@@ -101,6 +104,7 @@ export default function AddSingleListen({ iconSize="lg" action={() => { removeRecording(recording.id); + searchInputRef?.current?.focus(); }} /> } diff --git a/frontend/js/src/utils/SearchAlbumOrMBID.tsx b/frontend/js/src/utils/SearchAlbumOrMBID.tsx index 717708b3de..a86684f025 100644 --- a/frontend/js/src/utils/SearchAlbumOrMBID.tsx +++ b/frontend/js/src/utils/SearchAlbumOrMBID.tsx @@ -31,6 +31,7 @@ export default function SearchAlbumOrMBID({ const { APIService } = useContext(GlobalAppContext); const { lookupMBReleaseGroup, searchMBRelease } = APIService; const dropdownRef = DropdownRef(); + const searchInputRef = useRef(null); const [inputValue, setInputValue] = useState(defaultValue ?? ""); const [searchResults, setSearchResults] = useState< Array & WithArtistCredits> @@ -122,6 +123,7 @@ export default function SearchAlbumOrMBID({ setInputValue(""); setSearchResults([]); onSelectAlbum(); + searchInputRef?.current?.focus(); }; useEffect(() => { @@ -143,6 +145,7 @@ export default function SearchAlbumOrMBID({
(null); + + // Allow parents to focus on input + useImperativeHandle( + inputRefForParent, + () => { + return { + focus() { + inputRefLocal?.current?.focus(); + }, + }; + }, + [] + ); + + // Autofocus once on load + useEffect(() => { + inputRefLocal?.current?.focus(); + }, []); const handleError = useCallback( (error: string | Error, title?: string): void => { @@ -180,6 +200,7 @@ export default function SearchTrackOrMBID({ setInputValue(""); setSearchResults([]); setSelectedIndex(-1); + inputRefLocal?.current?.focus(); }; useEffect(() => { @@ -199,6 +220,7 @@ export default function SearchTrackOrMBID({
); -} +}); + +export default SearchTrackOrMBID;