From 8660605cfc6719e7d3a41178a675a9b186deddb1 Mon Sep 17 00:00:00 2001 From: Haroen Viaene Date: Fri, 18 Oct 2024 16:17:44 +0200 Subject: [PATCH] fix(widgets): remove answers widget (#6399) The answers widget has long been deprecated, and is removed without replacement as no answers service exists anymore. As a userland solution if you're using the answers widget, copy the removed answers files inside your own project and import it locally. BREAKING CHANGE: the answers widget no longer exists BREAKING CHANGE: the findAnswers in the helper no longer exists --- packages/algoliasearch-helper/index.d.ts | 16 - .../src/algoliasearch.helper.js | 49 -- .../spec/algoliasearch.helper/findAnswers.js | 102 ---- .../types/algoliasearch.d.ts | 19 - .../.storybook/static/answers.css | 132 ----- .../src/components/Answers/Answers.tsx | 79 --- .../Answers/__tests__/Answers-test.tsx | 130 ----- .../answers/__tests__/connectAnswers-test.ts | 452 ------------------ .../src/connectors/answers/connectAnswers.ts | 267 ----------- .../instantsearch.js/src/connectors/index.ts | 7 - .../src/types/render-state.ts | 4 +- packages/instantsearch.js/src/types/widget.ts | 2 - .../src/widgets/__tests__/index.test.ts | 4 - .../widgets/answers/__tests__/answers-test.ts | 170 ------- .../src/widgets/answers/answers.tsx | 201 -------- .../src/widgets/answers/defaultTemplates.ts | 15 - .../instantsearch.js/src/widgets/index.ts | 7 - .../stories/answers.stories.ts | 121 ----- specs/src/pages/widgets/answers.md | 58 --- 19 files changed, 1 insertion(+), 1834 deletions(-) delete mode 100644 packages/algoliasearch-helper/test/spec/algoliasearch.helper/findAnswers.js delete mode 100644 packages/instantsearch.js/.storybook/static/answers.css delete mode 100644 packages/instantsearch.js/src/components/Answers/Answers.tsx delete mode 100644 packages/instantsearch.js/src/components/Answers/__tests__/Answers-test.tsx delete mode 100644 packages/instantsearch.js/src/connectors/answers/__tests__/connectAnswers-test.ts delete mode 100644 packages/instantsearch.js/src/connectors/answers/connectAnswers.ts delete mode 100644 packages/instantsearch.js/src/widgets/answers/__tests__/answers-test.ts delete mode 100644 packages/instantsearch.js/src/widgets/answers/answers.tsx delete mode 100644 packages/instantsearch.js/src/widgets/answers/defaultTemplates.ts delete mode 100644 packages/instantsearch.js/stories/answers.stories.ts delete mode 100644 specs/src/pages/widgets/answers.md diff --git a/packages/algoliasearch-helper/index.d.ts b/packages/algoliasearch-helper/index.d.ts index c999bd8956..0b96519966 100644 --- a/packages/algoliasearch-helper/index.d.ts +++ b/packages/algoliasearch-helper/index.d.ts @@ -2,7 +2,6 @@ import EventEmitter from '@algolia/events'; // eslint-disable-next-line @typescript-eslint/consistent-type-imports import type { - FindAnswersResponse, FrequentlyBoughtTogetherQuery, HighlightResult, LookingSimilarQuery, @@ -163,21 +162,6 @@ declare namespace algoliasearchHelper { ) => void ): void; - /** - * Start the search for answers with the parameters set in the state. - * This method returns a promise. - * @param {Object} options - the options for answers API call - * @param {string[]} options.attributesForPrediction - Attributes to use for predictions. If empty, `searchableAttributes` is used instead. - * @param {string[]} options.queryLanguages - The languages in the query. Currently only supports ['en']. - * @param {number} options.nbHits - Maximum number of answers to retrieve from the Answers Engine. Cannot be greater than 1000. - * @deprecated answers is deprecated and will be replaced with new initiatives - */ - findAnswers(options: { - attributesForPrediction: string[]; - queryLanguages: string[]; - nbHits: number; - }): Promise>; - /** * Search for facet values based on an query and the name of a faceted attribute. This * triggers a search and will return a promise. On top of using the query, it also sends diff --git a/packages/algoliasearch-helper/src/algoliasearch.helper.js b/packages/algoliasearch-helper/src/algoliasearch.helper.js index 2edce2bbf3..ecd5ae229c 100644 --- a/packages/algoliasearch-helper/src/algoliasearch.helper.js +++ b/packages/algoliasearch-helper/src/algoliasearch.helper.js @@ -5,9 +5,7 @@ var EventEmitter = require('@algolia/events'); var DerivedHelper = require('./DerivedHelper'); var escapeFacetValue = require('./functions/escapeFacetValue').escapeFacetValue; var inherits = require('./functions/inherits'); -var merge = require('./functions/merge'); var objectHasKeys = require('./functions/objectHasKeys'); -var omit = require('./functions/omit'); var RecommendParameters = require('./RecommendParameters'); var RecommendResults = require('./RecommendResults'); var requestBuilder = require('./requestBuilder'); @@ -288,53 +286,6 @@ AlgoliaSearchHelper.prototype.searchOnce = function (options, cb) { ); }; -/** - * Start the search for answers with the parameters set in the state. - * This method returns a promise. - * @param {Object} options - the options for answers API call - * @param {string[]} options.attributesForPrediction - Attributes to use for predictions. If empty, `searchableAttributes` is used instead. - * @param {string[]} options.queryLanguages - The languages in the query. Currently only supports ['en']. - * @param {number} options.nbHits - Maximum number of answers to retrieve from the Answers Engine. Cannot be greater than 1000. - * - * @return {promise} the answer results - * @deprecated answers is deprecated and will be replaced with new initiatives - */ -AlgoliaSearchHelper.prototype.findAnswers = function (options) { - // eslint-disable-next-line no-console - console.warn('[algoliasearch-helper] answers is no longer supported'); - var state = this.state; - var derivedHelper = this.derivedHelpers[0]; - if (!derivedHelper) { - return Promise.resolve([]); - } - var derivedState = derivedHelper.getModifiedState(state); - var data = merge( - { - attributesForPrediction: options.attributesForPrediction, - nbHits: options.nbHits, - }, - { - params: omit(requestBuilder._getHitsSearchParams(derivedState), [ - 'attributesToSnippet', - 'hitsPerPage', - 'restrictSearchableAttributes', - 'snippetEllipsisText', - ]), - } - ); - - var errorMessage = - 'search for answers was called, but this client does not have a function client.initIndex(index).findAnswers'; - if (typeof this.client.initIndex !== 'function') { - throw new Error(errorMessage); - } - var index = this.client.initIndex(derivedState.index); - if (typeof index.findAnswers !== 'function') { - throw new Error(errorMessage); - } - return index.findAnswers(derivedState.query, options.queryLanguages, data); -}; - /** * Structure of each result when using * [`searchForFacetValues()`](reference.html#AlgoliaSearchHelper#searchForFacetValues) diff --git a/packages/algoliasearch-helper/test/spec/algoliasearch.helper/findAnswers.js b/packages/algoliasearch-helper/test/spec/algoliasearch.helper/findAnswers.js deleted file mode 100644 index fe5d20fc0a..0000000000 --- a/packages/algoliasearch-helper/test/spec/algoliasearch.helper/findAnswers.js +++ /dev/null @@ -1,102 +0,0 @@ -'use strict'; - -var algoliasearchHelper = require('../../../index'); - -function makeFakeFindAnswersResponse() { - return { - exhaustiveFacetsCount: true, - facetHits: [], - processingTimeMS: 3, - }; -} - -function setupTestEnvironment(helperOptions) { - var findAnswers = jest.fn(function () { - return Promise.resolve([makeFakeFindAnswersResponse()]); - }); - - var fakeClient = { - initIndex: function () { - return { - findAnswers: findAnswers, - }; - }, - }; - - var helper = algoliasearchHelper(fakeClient, 'index', helperOptions); - - return { - findAnswers: findAnswers, - helper: helper, - }; -} - -test('returns an empty array with no derived helper', function () { - var env = setupTestEnvironment(); - var helper = env.helper; - var findAnswers = env.findAnswers; - - return helper - .findAnswers({ - attributesForPrediction: ['description'], - queryLanguages: ['en'], - nbHits: 1, - }) - .then(function (result) { - expect(findAnswers).toHaveBeenCalledTimes(0); - expect(result).toEqual([]); - }); -}); - -test('returns a correct result with one derivation', function () { - var env = setupTestEnvironment(); - var helper = env.helper; - var findAnswers = env.findAnswers; - - helper.derive(function (state) { - return state; - }); - - return helper - .findAnswers({ - attributesForPrediction: ['description'], - queryLanguages: ['en'], - nbHits: 1, - }) - .then(function (result) { - expect(findAnswers).toHaveBeenCalledTimes(1); - expect(result).toEqual([makeFakeFindAnswersResponse()]); - }); -}); - -test('runs findAnswers with facets', function () { - var env = setupTestEnvironment({ facets: ['facet1'] }); - var helper = env.helper; - var findAnswers = env.findAnswers; - helper.addFacetRefinement('facet1', 'facetValue'); - - helper.derive(function (state) { - return state; - }); - - helper.setQuery('hello'); - - return helper - .findAnswers({ - attributesForPrediction: ['description'], - queryLanguages: ['en'], - nbHits: 1, - }) - .then(function () { - expect(findAnswers).toHaveBeenCalledTimes(1); - expect(findAnswers).toHaveBeenCalledWith('hello', ['en'], { - attributesForPrediction: ['description'], - nbHits: 1, - params: { - facetFilters: ['facet1:facetValue'], - facets: ['facet1'], - query: 'hello', - }, - }); - }); -}); diff --git a/packages/algoliasearch-helper/types/algoliasearch.d.ts b/packages/algoliasearch-helper/types/algoliasearch.d.ts index 01b7972c0e..3ad8e12e6f 100644 --- a/packages/algoliasearch-helper/types/algoliasearch.d.ts +++ b/packages/algoliasearch-helper/types/algoliasearch.d.ts @@ -280,25 +280,6 @@ export type SearchForFacetValuesResponse = PickForClient<{ v5: AlgoliaSearch.SearchForFacetValuesResponse; }>; -export type FindAnswersOptions = PickForClient<{ - v3: any; // answers only exists in v4 - // @ts-ignore - v4: ClientSearch.FindAnswersOptions; - v5: any; // answers only exists in v4 -}>; -export type FindAnswersResponse = PickForClient<{ - v3: any; // answers only exists in v4 - // @ts-ignore - v4: ClientSearch.FindAnswersResponse; - v5: any; // answers only exists in v4 -}>; -export type FindAnswers = PickForClient<{ - v3: any; // answers only exists in v4 - // @ts-ignore - v4: ReturnType['findAnswers']; - v5: any; // answers only exists in v4 -}>; - export type SupportedLanguage = PickForClient<{ v3: string; v4: string; diff --git a/packages/instantsearch.js/.storybook/static/answers.css b/packages/instantsearch.js/.storybook/static/answers.css deleted file mode 100644 index 31663e3fb2..0000000000 --- a/packages/instantsearch.js/.storybook/static/answers.css +++ /dev/null @@ -1,132 +0,0 @@ -.my-Answers .ais-Answers-loader { - display: none; -} - -.my-Answers .ais-Answers-list { - list-style: none; - margin: 0; - padding: 0; -} - -.my-Answers .ais-Answers-item { - height: 10rem; - border: 1px solid #ddd; - border-radius: 0.5rem; -} - -.my-Answers .title { - padding: 0; - margin: 1rem; - font-size: 1.2rem; - color: #333; - line-height: 1.4rem; -} - -.my-Answers .separator { - border-top: 1px solid #ddd; -} - -.my-Answers .description { - margin: 1rem; - padding: 0; - color: #333; - line-height: 1.4rem; -} - -.my-Answers .description em { - background-color: #ffc168; -} - -.one-line { - display: -webkit-box; - -webkit-line-clamp: 1; - -webkit-box-orient: vertical; - overflow: hidden; -} - -.three-lines { - display: -webkit-box; - -webkit-line-clamp: 3; - -webkit-box-orient: vertical; - overflow: hidden; -} - -/* skeleton loader from https://codepen.io/jordanmsykes/pen/RgPqgV - begin */ -@keyframes placeHolderShimmer { - 0% { - -webkit-transform: translateZ(0); - transform: translateZ(0); - background-position: -468px 0; - } - to { - -webkit-transform: translateZ(0); - transform: translateZ(0); - background-position: 468px 0; - } -} - -.card-skeleton { - margin-left: 1rem; - margin-right: 1rem; - width: calc(100% - 2rem); - height: 10rem; - transition: all 0.3s ease-in-out; - -webkit-backface-visibility: hidden; - background: #fff; - z-index: 10; - opacity: 1; -} - -.card-skeleton.hidden { - transition: all 0.3s ease-in-out; - opacity: 0; - height: 0; - padding: 0; -} - -.card-skeleton-img { - width: 100%; - height: 120px; - background: #e6e6e6; - display: block; -} - -.animated-background { - will-change: transform; - animation: placeHolderShimmer 1s linear infinite forwards; - -webkit-backface-visibility: hidden; - background: #e6e6e6; - background: linear-gradient(90deg, #eee 8%, #ddd 18%, #eee 33%); - background-size: 800px 104px; - height: 100%; - position: relative; -} - -.skel-mask-container { - position: relative; -} - -.skel-mask { - background: #fff; - position: absolute; - z-index: 200; -} - -.skel-mask-1 { - width: 100%; - height: 15px; - top: 0; -} - -.skel-mask-2 { - width: 100%; - height: 25px; - top: 45px; -} - -.skel-mask-3 { - width: 100%; - height: 15px; - top: 145px; -} -/* skeleton loader - end */ diff --git a/packages/instantsearch.js/src/components/Answers/Answers.tsx b/packages/instantsearch.js/src/components/Answers/Answers.tsx deleted file mode 100644 index 3e74ccf476..0000000000 --- a/packages/instantsearch.js/src/components/Answers/Answers.tsx +++ /dev/null @@ -1,79 +0,0 @@ -/** @jsx h */ - -import { cx } from 'instantsearch-ui-components'; -import { h } from 'preact'; - -import { warning } from '../../lib/utils'; -import Template from '../Template/Template'; - -import type { ComponentCSSClasses, Hit } from '../../types'; -import type { - AnswersCSSClasses, - AnswersTemplates, -} from '../../widgets/answers/answers'; - -export type AnswersComponentCSSClasses = ComponentCSSClasses; - -export type AnswersComponentTemplates = Required; - -export type AnswersProps = { - hits: Hit[]; - isLoading: boolean; - cssClasses: AnswersComponentCSSClasses; - templateProps: { - [key: string]: any; - templates: AnswersComponentTemplates; - }; -}; - -const Answers = ({ - hits, - isLoading, - cssClasses, - templateProps, -}: AnswersProps) => ( -
-