typesense-instantsearch-adapter icon indicating copy to clipboard operation
typesense-instantsearch-adapter copied to clipboard

How to do a manual search when using typsense instantsearch with Vue

Open robjbrain opened this issue 9 months ago • 2 comments

Description

I would like to do a manual search when clicking somewhere else on a page such as a button.

Steps to reproduce

The instructions given by algolia are to use:

searchClient.helper.setQuery('My Term').search();

Expected Behavior

I expect a search to be performed for "My Term"

Actual Behavior

I get the error Uncaught TypeError: Cannot read properties of undefined (reading 'setQuery')

This is because helper is null in the object returned from typesenseInstantsearchAdapter.searchClient

robjbrain avatar Apr 30 '24 01:04 robjbrain

To access the helper you want to use the searchFunction prop: https://www.algolia.com/doc/api-reference/widgets/instantsearch/vue/#widget-param-search-function

jasonbosco avatar Apr 30 '24 02:04 jasonbosco

@jasonbosco i'm not sure how that helps without an example. It seems like you would need the helper to call the searchFunction method rather than accessing the helper via it?

I've found that you can use v-model however I can't find any reference to using v-model in the documentation for this adaptor or the original algolia package so i'm concerned it's not the right way to be going about things.

Here's an example:

<template>
   <button @click="getFooBar()">Get Foo Bar</button>
  <ais-instant-search index-name="nameOfIndex" :search-client="searchClient">
    <div class="right-panel">
      <ais-search-box v-model="searchTerm" />
      <ais-hits>
        <template v-slot:item="{ item }">
          <h2>{{ item.name }}</h2>
        </template>

      </ais-hits>
      <ais-pagination />
    </div>
  </ais-instant-search>
</template>


<script>
import TypesenseInstantSearchAdapter from "typesense-instantsearch-adapter";
import { ref } from 'vue'

const typesenseInstantsearchAdapter = new TypesenseInstantSearchAdapter({
  ...
});

const searchClient = typesenseInstantsearchAdapter.searchClient;

export default {
  setup() {
    let getFooBar = () => {
      searchTerm.value = 'foobar'
    }

    let searchTerm = ref('')

    return {
      searchClient,
      getFooBar,
      searchTerm
    }
  }
};
</script>

robjbrain avatar Apr 30 '24 04:04 robjbrain