Hook useGetGroupsChats

O hook useSearch é responsável por gerenciar a funcionalidade de pesquisa dentro de um contexto de chat. Ele permite que os usuários pesquisem termos específicos nas mensagens e naveguem entre as ocorrências encontradas. O hook utiliza os contextos SearchContext e ChatContext para gerenciar e acessar o estado relacionado à pesquisa e às mensagens.

Função e Utilização

  • useContext: Hooks do React para acessar o estado de SearchContext e ChatContext.
  • useEffect: Hook do React para executar efeitos colaterais em resposta a mudanças de estado.
  • ChangeEvent: Tipagem de evento para manipulação de mudanças no input de busca.

Estado e Hooks Utilizados

  • searchTerm: Termo de pesquisa atual.
  • setSearchTerm: Função para atualizar o termo de pesquisa.
  • activeIndex: Índice atual do termo de pesquisa destacado.
  • setActiveIndex: Função para atualizar o índice ativo.
  • messages: Lista de mensagens no contexto do chat.

Funções Utilizadas

  • getMatchCounts: Função auxiliar para obter a contagem de correspondências do termo de pesquisa nas mensagens.
  • handleSearchInputChange: Manipulador de eventos para atualizações no input de busca.
  • handleNextHighlight:Função para mover para a próxima ocorrência do termo de pesquisa.
  • handlePrevHighlight: Função para mover para a ocorrência anterior do termo de pesquisa.

Descrição dos Retornos

  • searchTerm de pesquisa atual.
  • handleSearchInputChange : Função para manipular mudanças no input de pesquisa.
  • handleNextHighlight : Função para mover para a próxima ocorrência do termo de pesquisa.
  • handlePrevHighlight ção para mover para a ocorrência anterior do termo de pesquisa.
  • isNextDisabled: Booleano indicando se o botão de próxima ocorrência está desabilitado.
  • isPrevDisabled: Booleano indicando se o botão de ocorrência anterior está desabilitado.
  • activeIndex :Índice da ocorrência atual do termo de pesquisa.
  • totalMatches : Número total de ocorrências do termo de pesquisa.

Estrutura do Código

import { ChatContext } from '@/contexts/chatContext'
import { SearchContext } from '@/contexts/searchContext'
import { getMatchCounts } from '@/utils/helpers/activeIndex'
import { ChangeEvent, useContext, useEffect } from 'react'

export const useSearch = () => {
  const { searchTerm, setSearchTerm, activeIndex, setActiveIndex } =
    useContext(SearchContext)

  const { messages } = useContext(ChatContext)

  const matchCounts = getMatchCounts(messages, searchTerm)
  const totalMatches = matchCounts.reduce((a, b) => a + b, 0)

  const handleSearchInputChange = (event: ChangeEvent<HTMLInputElement>) => {
    const searchTerm = event.target.value
    setSearchTerm(searchTerm)

    if (!totalMatches || totalMatches === 0) {
      setActiveIndex(0)
    }

    if (totalMatches || totalMatches > 0) {
      setActiveIndex(1)
    }
  }

  useEffect(() => {
    document.querySelector('.Active')?.scrollIntoView({
      behavior: 'auto',
      block: 'center',
    })
  }, [activeIndex])

  useEffect(() => {
    if (searchTerm && totalMatches > 0) {
      document.querySelector('.Active')?.scrollIntoView({
        behavior: 'auto',
        block: 'center',
      })
    }
  }, [activeIndex, searchTerm, totalMatches])

  const handleNextHighlight = () => {
    if (activeIndex < totalMatches - 1) {
      setActiveIndex(activeIndex + 1)
      document.querySelector('.Active')?.scrollIntoView({
        behavior: 'smooth',
        block: 'center',
      })
    }
  }

  const handlePrevHighlight = () => {
    if (activeIndex > 0) {
      setActiveIndex(activeIndex - 1)
      document.querySelector('.Active')?.scrollIntoView({
        behavior: 'smooth',
        block: 'center',
      })
    }
  }

  const isNextDisabled = activeIndex >= totalMatches - 1
  const isPrevDisabled = activeIndex <= 0

  return {
    searchTerm,
    handleSearchInputChange,
    handleNextHighlight,
    handlePrevHighlight,
    isNextDisabled,
    isPrevDisabled,
    activeIndex,
    totalMatches: matchCounts.reduce((acc, curr) => acc + curr, 0),
  }
}

Exemplo de Uso