Skip to content
This repository has been archived by the owner on Feb 4, 2024. It is now read-only.

Commit

Permalink
👽 replace dart_algolia with algoliasearch
Browse files Browse the repository at this point in the history
  • Loading branch information
techouse committed Dec 17, 2023
1 parent 0802569 commit 0573a11
Show file tree
Hide file tree
Showing 5 changed files with 163 additions and 130 deletions.
3 changes: 2 additions & 1 deletion bin/main.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import 'dart:io' show File, exitCode, stdout;

import 'package:alfred_workflow/alfred_workflow.dart';
import 'package:algolia/algolia.dart';
import 'package:algoliasearch/src/model/hit.dart';
import 'package:algoliasearch/src/model/search_response.dart';
import 'package:args/args.dart';
import 'package:cli_script/cli_script.dart';
import 'package:stash/stash_api.dart';
Expand Down
135 changes: 73 additions & 62 deletions bin/main_helpers.dart
Original file line number Diff line number Diff line change
Expand Up @@ -39,72 +39,83 @@ Future<void> _performSearch(
String query, {
Fitzpatrick? tone,
}) async {
final AlgoliaQuerySnapshot snapshot = await AlgoliaSearch.query(
query,
tone: tone,
);
try {
final SearchResponse searchResponse = await AlgoliaSearch.query(
query,
tone: tone,
);

if (snapshot.nbHits > 0) {
_workflow.addItems(await Future.wait(snapshot.hits
.map((AlgoliaObjectSnapshot snapshot) =>
SearchResult.fromJson(snapshot.data))
.map((SearchResult emoji) async {
final File? image =
await EmojiDownloader(emoji: emoji.char).downloadImage();
if (searchResponse.nbHits > 0) {
_workflow.addItems(await Future.wait(searchResponse.hits
.map((Hit hit) => SearchResult.fromJson(
<String, dynamic>{...hit, 'objectID': hit.objectID}))
.map(
(SearchResult emoji) async {
final File? image =
await EmojiDownloader(emoji: emoji.char).downloadImage();

return AlfredItem(
uid: emoji.objectID,
title: emoji.name,
subtitle: '${emoji.char} :${emoji.shortName}:',
arg: emoji.char,
match: '${emoji.shortName} ${emoji.name} ${emoji.keywords.join(', ')}',
text: AlfredItemText(
copy: emoji.char,
largeType: emoji.name,
),
quickLookUrl:
Uri.https('emojipedia.org', 'emoji/${emoji.char}/').toString(),
icon: AlfredItemIcon(path: image?.absolute.path ?? 'question.png'),
mods: {
{AlfredItemModKey.alt}: AlfredItemMod(
subtitle: 'Copy ":${emoji.shortName}:" to clipboard',
arg: ':${emoji.shortName}:',
icon: AlfredItemIcon(path: image?.absolute.path ?? 'question.png'),
),
{AlfredItemModKey.shift}: AlfredItemMod(
subtitle: 'Copy Python source of "${emoji.char}" to clipboard',
arg: 'u"\\U000'
'${emoji.char.runes.first.toRadixString(16).toUpperCase()}'
'${emoji.char.runes.toList().sublist(1).map(
(int i) => '\\u${i.toRadixString(16).toUpperCase()}',
).join()}"',
return AlfredItem(
uid: emoji.objectID,
title: emoji.name,
subtitle: '${emoji.char} :${emoji.shortName}:',
arg: emoji.char,
match:
'${emoji.shortName} ${emoji.name} ${emoji.keywords.join(', ')}',
text: AlfredItemText(
copy: emoji.char,
largeType: emoji.name,
),
quickLookUrl:
Uri.https('emojipedia.org', 'emoji/${emoji.char}/').toString(),
icon: AlfredItemIcon(path: image?.absolute.path ?? 'question.png'),
),
{AlfredItemModKey.ctrl}: AlfredItemMod(
subtitle: 'Copy HTML Entity of "${emoji.char}" to clipboard',
arg: emoji.char.runes
.map((int i) => '&#x${i.toRadixString(16)};')
.join(),
icon: AlfredItemIcon(path: image?.absolute.path ?? 'question.png'),
),
{AlfredItemModKey.ctrl, AlfredItemModKey.shift}: AlfredItemMod(
subtitle:
'Copy formal Unicode notation of "${emoji.char}" to clipboard',
arg: emoji.char.runes
.map((int i) => 'U+${i.toRadixString(16).toUpperCase()}')
.join(', '),
icon: AlfredItemIcon(path: image?.absolute.path ?? 'question.png'),
),
mods: {
{AlfredItemModKey.alt}: AlfredItemMod(
subtitle: 'Copy ":${emoji.shortName}:" to clipboard',
arg: ':${emoji.shortName}:',
icon: AlfredItemIcon(
path: image?.absolute.path ?? 'question.png'),
),
{AlfredItemModKey.shift}: AlfredItemMod(
subtitle: 'Copy Python source of "${emoji.char}" to clipboard',
arg: 'u"\\U000'
'${emoji.char.runes.first.toRadixString(16).toUpperCase()}'
'${emoji.char.runes.toList().sublist(1).map(
(int i) => '\\u${i.toRadixString(16).toUpperCase()}',
).join()}"',
icon: AlfredItemIcon(
path: image?.absolute.path ?? 'question.png'),
),
{AlfredItemModKey.ctrl}: AlfredItemMod(
subtitle: 'Copy HTML Entity of "${emoji.char}" to clipboard',
arg: emoji.char.runes
.map((int i) => '&#x${i.toRadixString(16)};')
.join(),
icon: AlfredItemIcon(
path: image?.absolute.path ?? 'question.png'),
),
{AlfredItemModKey.ctrl, AlfredItemModKey.shift}: AlfredItemMod(
subtitle:
'Copy formal Unicode notation of "${emoji.char}" to clipboard',
arg: emoji.char.runes
.map((int i) => 'U+${i.toRadixString(16).toUpperCase()}')
.join(', '),
icon: AlfredItemIcon(
path: image?.absolute.path ?? 'question.png'),
),
},
valid: true,
);
},
valid: true,
).toList()));
} else {
_workflow.addItem(
AlfredItem(
title: 'No matching emoji found',
icon: AlfredItemIcon(path: 'question.png'),
),
);
}).toList()));
} else {
_workflow.addItem(
AlfredItem(
title: 'No matching emoji found',
icon: AlfredItemIcon(path: 'question.png'),
),
);
}
} finally {
AlgoliaSearch.dispose();
}
}
37 changes: 19 additions & 18 deletions bin/src/services/algolia_search.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import 'package:algolia/algolia.dart'
show Algolia, AlgoliaQuery, AlgoliaQuerySnapshot;
import 'package:algoliasearch/algoliasearch_lite.dart';

import '../env/env.dart';
import '../models/fitzpatrick.dart';
Expand All @@ -8,26 +7,28 @@ import '../models/search_result.dart';
class AlgoliaSearch {
AlgoliaSearch._();

static final Algolia _algolia = Algolia.init(
applicationId: Env.algoliaApplicationId,
static final SearchClient _client = SearchClient(
appId: Env.algoliaApplicationId,
apiKey: Env.algoliaSearchOnlyApiKey,
);

static Future<AlgoliaQuerySnapshot> query(
static Future<SearchResponse> query(
String queryString, {
Fitzpatrick? tone,
}) async {
final AlgoliaQuery query = _algolia.instance
.index(Env.algoliaSearchIndex)
.query(queryString)
.setAttributesToRetrieve(SearchResult.attributesToRetrieve)
.filters([
if (tone != null) 'variants:$tone<score=1>',
'variants:tone0<score=0>',
].join(' OR '))
.setPage(0)
.setHitsPerPage(20);
}) =>
_client.searchIndex(
request: SearchForHits(
indexName: Env.algoliaSearchIndex,
query: queryString,
attributesToRetrieve: SearchResult.attributesToRetrieve,
filters: [
if (tone != null) 'variants:$tone<score=1>',
'variants:tone0<score=0>',
].join(' OR '),
page: 0,
hitsPerPage: 20,
),
);

return await query.getObjects();
}
static dispose() => _client.dispose();
}
Loading

0 comments on commit 0573a11

Please sign in to comment.