🏡 index : quine-global/quintodrome.git

import { useEffect, useRef } from 'react'
import { useLocation } from 'react-router-dom'

// Search field names used by SearchInput across different list views:
// - 'name': AlbumList, ArtistList, LibraryList, PlayerList, RadioList, UserList
// - 'title': SongList
// - 'q': PlaylistList
// If a new list view uses a different source field, add it here.
const SEARCH_FIELDS = ['name', 'title', 'q']

const getSearchValue = (filter) => {
  for (const field of SEARCH_FIELDS) {
    if (filter[field]) return filter[field]
  }
  return ''
}

export const useSearchRefocus = () => {
  const location = useLocation()
  const prevSearchValue = useRef(null)

  useEffect(() => {
    const params = new URLSearchParams(location.search)
    const filterStr = params.get('filter') || '{}'

    let filter = {}
    try {
      filter = JSON.parse(filterStr)
    } catch (e) {
      // Invalid JSON, ignore
    }

    const searchValue = getSearchValue(filter)

    if (prevSearchValue.current && !searchValue) {
      // Use requestAnimationFrame to wait for React to finish re-rendering
      // after the URL change before focusing the input
      requestAnimationFrame(() => {
        // Selector depends on react-admin's internal class naming.
        // If react-admin changes these class names, this will need updating.
        const input = document.querySelector('[class*="RaSearchInput"] input')
        if (input) {
          input.focus()
        }
      })
    }

    prevSearchValue.current = searchValue
  }, [location.search])
}