Spaces:
Paused
Paused
| import Fuse from 'fuse.js'; | |
| import { computed } from 'vue'; | |
| import type { Ref } from 'vue'; | |
| import type { Repo } from '~/lib/api/types'; | |
| /* | |
| * Compares Repos lexicographically using owner/name . | |
| */ | |
| function repoCompare(a: Repo, b: Repo) { | |
| const x = `${a.owner}/${a.name}`; | |
| const y = `${b.owner}/${b.name}`; | |
| return x === y ? 0 : x > y ? 1 : -1; | |
| } | |
| export function useRepoSearch(repos: Ref<Repo[] | undefined>, search: Ref<string>) { | |
| const searchIndex = computed( | |
| () => | |
| new Fuse(repos.value ?? [], { | |
| includeScore: true, | |
| keys: ['name', 'owner'], | |
| threshold: 0.4, | |
| }), | |
| ); | |
| const searchedRepos = computed(() => { | |
| if (search.value === '') { | |
| return repos.value?.sort(repoCompare); | |
| } | |
| return searchIndex.value | |
| .search(search.value) | |
| .map((result) => result.item) | |
| .sort(repoCompare); | |
| }); | |
| return { | |
| searchedRepos, | |
| }; | |
| } | |