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.
This commit is contained in:
@@ -1,31 +1,38 @@
|
|||||||
import { computed } from "vue"
|
import { computed } from "vue"
|
||||||
|
|
||||||
|
import { DataType } from "@/data/DataType.enum"
|
||||||
import { useRepos } from "@/hooks/useRepos.hook"
|
import { useRepos } from "@/hooks/useRepos.hook"
|
||||||
import { useFavoriteRepos } from "@/modules/repo/hooks/useFavoriteRepos.hook"
|
import { useFavoriteRepos } from "@/modules/repo/hooks/useFavoriteRepos.hook"
|
||||||
import { RepoBase } from "@/modules/repo/interfaces/RepoBase"
|
import { RepoBase } from "@/modules/repo/interfaces/RepoBase"
|
||||||
|
|
||||||
|
const FAVORITE_ID_PREFIX = `${DataType.FavoriteRepo}-`
|
||||||
|
|
||||||
export const useRepoList = () => {
|
export const useRepoList = () => {
|
||||||
const { savedFavoriteRepos, addFavorite, removeFavorite } = useFavoriteRepos()
|
const { savedFavoriteRepos, addFavorite, removeFavorite } = useFavoriteRepos()
|
||||||
const { repos, canLoadMore, loadMore } = useRepos()
|
const { repos, canLoadMore, loadMore } = useRepos()
|
||||||
|
|
||||||
const favoriteRepos = computed(() => {
|
const favoriteRepos = computed<RepoBase[]>(() =>
|
||||||
return repos.value.filter((repo) =>
|
savedFavoriteRepos.value.map((fav) => ({
|
||||||
savedFavoriteRepos.value.find(
|
id: fav._id?.startsWith(FAVORITE_ID_PREFIX)
|
||||||
(fav) => fav._id?.includes(repo.id) ?? false
|
? fav._id.slice(FAVORITE_ID_PREFIX.length)
|
||||||
|
: (fav._id ?? ""),
|
||||||
|
name: fav.name,
|
||||||
|
isPrivate: fav.isPrivate
|
||||||
|
}))
|
||||||
)
|
)
|
||||||
)
|
|
||||||
})
|
|
||||||
|
|
||||||
const otherRepos = computed(() => {
|
|
||||||
return repos.value.filter(
|
|
||||||
(repo) => !favoriteRepos.value.find((favorite) => favorite.id === repo.id)
|
|
||||||
)
|
|
||||||
})
|
|
||||||
|
|
||||||
const favoriteCheckboxes = computed(() =>
|
const favoriteCheckboxes = computed(() =>
|
||||||
favoriteRepos.value.map((favorite) => favorite.id)
|
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) => {
|
const toggleCheckbox = async (repo: RepoBase) => {
|
||||||
if (favoriteCheckboxes.value.includes(repo.id)) {
|
if (favoriteCheckboxes.value.includes(repo.id)) {
|
||||||
await removeFavorite(repo)
|
await removeFavorite(repo)
|
||||||
|
|||||||
Reference in New Issue
Block a user