From e11609990d83e5b50ca96671855b5538b8487d5f Mon Sep 17 00:00:00 2001 From: Julien Calixte Date: Sun, 17 May 2026 00:24:47 +0200 Subject: [PATCH] fix(repo): derive starred list from saved favorites Starred section used to intersect favorites with the paginated GitHub repo list, so favorites past the first page only appeared after the user scrolled. Derive RepoBase directly from PouchDB favorites and exclude them from "all repos" by both id and name. --- src/modules/repo/hooks/useRepoList.hook.ts | 33 +++++++++++++--------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/src/modules/repo/hooks/useRepoList.hook.ts b/src/modules/repo/hooks/useRepoList.hook.ts index fd9200e..4e4a7db 100644 --- a/src/modules/repo/hooks/useRepoList.hook.ts +++ b/src/modules/repo/hooks/useRepoList.hook.ts @@ -1,31 +1,38 @@ import { computed } from "vue" +import { DataType } from "@/data/DataType.enum" import { useRepos } from "@/hooks/useRepos.hook" import { useFavoriteRepos } from "@/modules/repo/hooks/useFavoriteRepos.hook" import { RepoBase } from "@/modules/repo/interfaces/RepoBase" +const FAVORITE_ID_PREFIX = `${DataType.FavoriteRepo}-` + export const useRepoList = () => { const { savedFavoriteRepos, addFavorite, removeFavorite } = useFavoriteRepos() const { repos, canLoadMore, loadMore } = useRepos() - const favoriteRepos = computed(() => { - return repos.value.filter((repo) => - savedFavoriteRepos.value.find( - (fav) => fav._id?.includes(repo.id) ?? false - ) - ) - }) - - const otherRepos = computed(() => { - return repos.value.filter( - (repo) => !favoriteRepos.value.find((favorite) => favorite.id === repo.id) - ) - }) + const favoriteRepos = computed(() => + savedFavoriteRepos.value.map((fav) => ({ + id: fav._id?.startsWith(FAVORITE_ID_PREFIX) + ? fav._id.slice(FAVORITE_ID_PREFIX.length) + : (fav._id ?? ""), + name: fav.name, + isPrivate: fav.isPrivate + })) + ) const favoriteCheckboxes = computed(() => favoriteRepos.value.map((favorite) => favorite.id) ) + const otherRepos = computed(() => { + const starredIds = new Set(favoriteCheckboxes.value) + const starredNames = new Set(favoriteRepos.value.map((r) => r.name)) + return repos.value.filter( + (repo) => !starredIds.has(repo.id) && !starredNames.has(repo.name) + ) + }) + const toggleCheckbox = async (repo: RepoBase) => { if (favoriteCheckboxes.value.includes(repo.id)) { await removeFavorite(repo)