Skip to content

Commit

Permalink
feat(frontend): handle content snippeting (#51)
Browse files Browse the repository at this point in the history
  • Loading branch information
Jerska authored Sep 29, 2020
1 parent e8ff4d3 commit 61a0d4e
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 14 deletions.
42 changes: 31 additions & 11 deletions frontend/src/AutocompleteWrapper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,11 @@ if (!isMsie()) {
delete css.inputWithNoHint.verticalAlign;
}

import algoliasearch, { SearchClient, SearchIndex } from 'algoliasearch';
import { RequestOptions } from '@algolia/transporter';
import type { SearchClient, SearchIndex } from 'algoliasearch';
import type { RequestOptions } from '@algolia/transporter';
import type { Hit } from '@algolia/client-search';

import algoliasearch from 'algoliasearch';
import autocomplete from 'autocomplete.js';

import type { Options } from './options';
Expand All @@ -18,6 +21,7 @@ import { addCss } from './addCss';

// @ts-ignore
import { version } from '../package.json';
import { Data } from './data';

export type SizeModifier = null | 'xs' | 'sm';

Expand Down Expand Up @@ -70,7 +74,10 @@ class AutocompleteWrapper {
hitsPerPage,
highlightPreTag: '<span class="aa-hit--highlight">',
highlightPostTag: '</span>',
attributesToSnippet: [`description:${nbSnippetWords}`],
attributesToSnippet: [
`description:${nbSnippetWords}`,
`content:${nbSnippetWords}`,
],
snippetEllipsisText: '...',
};

Expand Down Expand Up @@ -135,21 +142,34 @@ class AutocompleteWrapper {
}

private createSource(searchParams: RequestOptions) {
return (query: string, callback: (hits: any[]) => void) => {
this.index.search('', { ...searchParams, query }).then((content) => {
callback(content.hits);
});
return (query: string, callback: (hits: Array<Hit<Data>>) => void) => {
this.index
.search<Data>('', { ...searchParams, query })
.then((content) => {
callback(content.hits);
});
};
}

private createRenderSuggestion(sizeModifier: SizeModifier) {
return (hit: any): string => {
// eslint-disable-next-line no-param-reassign
hit.sizeModifier = sizeModifier;
return templates.autocomplete.suggestion(hit);
return (hit: Hit<Data>): string => {
return templates.autocomplete.suggestion({
...hit,
sizeModifier,
snippet: this.getSuggestionSnippet(hit),
});
};
}

private getSuggestionSnippet(hit: Hit<Data>) {
const { description, content } = hit._snippetResult!;
if (description.matchLevel === 'full') return description.value;
if (content.matchLevel === 'full') return content.value;
if (description.matchLevel === 'partial') return description.value;
if (content.matchLevel === 'partial') return content.value;
return description.value;
}

private createHandleSelected() {
return (_event: any, suggestion: { url: string }) => {
window.location.href = suggestion.url;
Expand Down
8 changes: 8 additions & 0 deletions frontend/src/data.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
export interface Data {
url: string;

title: string;
description: string;

content: string;
}
12 changes: 9 additions & 3 deletions frontend/src/templates.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,17 @@
import type { Hit } from '@algolia/client-search';

import { SizeModifier } from './AutocompleteWrapper';
import { Data } from './data';
import { escapeHTML } from './escapeHTML';

export interface Templates {
algolia: (hostname: string) => string;
autocomplete: {
css: (color: string) => string;
poweredBy: (algoliaLogoHtml: string) => string;
suggestion: (hit: any) => string;
suggestion: (
hit: Hit<Data> & { sizeModifier: SizeModifier; snippet: string }
) => string;
};
}

Expand Down Expand Up @@ -37,8 +43,8 @@ export const templates: Templates = {
</div>`,
suggestion: (hit) => `
<div class="aa-hit aa-hit__${hit.sizeModifier}">
<div class="aa-hit--title">${hit._highlightResult.title.value}</div>
<div class="aa-hit--description">${hit._snippetResult.description.value}</div>
<div class="aa-hit--title">${hit._highlightResult!.title.value}</div>
<div class="aa-hit--description">${hit.snippet}</div>
</div>
`,
},
Expand Down

0 comments on commit 61a0d4e

Please sign in to comment.