{
@drop="onDrop"
>
-
+
diff --git a/resources/components/stars/StarredRepo.vue b/resources/components/stars/StarredRepo.vue
index 6f1815d7..70e10660 100644
--- a/resources/components/stars/StarredRepo.vue
+++ b/resources/components/stars/StarredRepo.vue
@@ -183,7 +183,7 @@ const onDragEnd = () => {
role="presentation"
/>
- {{ repo.node.stargazers.totalCount.toLocaleString() }}
+ {{ repo.node.stargazerCount.toLocaleString() }}
diff --git a/resources/components/stars/StarredRepoList.vue b/resources/components/stars/StarredRepoList.vue
index 56ed999a..3326f92d 100644
--- a/resources/components/stars/StarredRepoList.vue
+++ b/resources/components/stars/StarredRepoList.vue
@@ -34,16 +34,7 @@ watch([reposHaveSynced, pageInfoHasSynced], async syncChecks => {
if (syncChecks.every(Boolean) && starsStore.pageInfo.hasNextPage) {
// We're ready to start fetching stars
await nextTick()
- while (starsStore.pageInfo.hasNextPage) {
- const { viewer } = await starsStore.fetchStars(starsStore.pageInfo.endCursor)
-
- starsStore.totalRepos = viewer.starredRepositories.totalCount
- starsStore.pageInfo = viewer.starredRepositories.pageInfo
-
- starsStore.starredRepos = starsStore.starredRepos.concat(viewer.starredRepositories.edges)
- }
-
- starsStore.isFetchingStars = false
+ await starsStore.fetchStars(starsStore.pageInfo.endCursor)
}
})
diff --git a/resources/queries/index.ts b/resources/queries/index.ts
index 5577f35f..dba39be8 100644
--- a/resources/queries/index.ts
+++ b/resources/queries/index.ts
@@ -1,15 +1,7 @@
-import { FetchDirection } from '@/types'
-
-export const fetchStarsQuery = (
- cursor: Nullable = null,
- direction: FetchDirection = FetchDirection.DESC,
- perPage = 100
-): string => {
- const cursorFilter = cursor ? `after:"${cursor}"` : 'after:null'
-
- return `{
+export const fetchStarsQuery = (perPage = 100): string => {
+ return `query FetchStars($cursor: String, $direction: OrderDirection!) {
viewer {
- starredRepositories(first: ${perPage}, orderBy: {field: STARRED_AT, direction: ${direction}}, ${cursorFilter}) {
+ starredRepositories(first: ${perPage}, orderBy: {field: STARRED_AT, direction: $direction}, after: $cursor) {
totalCount
edges {
node {
@@ -19,24 +11,15 @@ export const fetchStarsQuery = (
url
databaseId
isArchived
- defaultBranchRef {
- name
- }
primaryLanguage {
name
}
- stargazers {
- totalCount
+ defaultBranchRef {
+ name
}
+ stargazerCount
forkCount
pushedAt
- releases(first: 1, orderBy: {field: CREATED_AT, direction: DESC}) {
- edges {
- node {
- tagName
- }
- }
- }
}
cursor
}
diff --git a/resources/store/useStarsStore.ts b/resources/store/useStarsStore.ts
index 9ed41dea..cb5c6773 100644
--- a/resources/store/useStarsStore.ts
+++ b/resources/store/useStarsStore.ts
@@ -1,3 +1,5 @@
+import { Octokit } from 'octokit'
+import { paginateGraphQL } from '@octokit/plugin-paginate-graphql'
import { fetchStarsQuery, removeStarQuery } from '@/queries'
import { useStarsFilterStore } from '@/store/useStarsFilterStore'
import { useUserStore } from '@/store/useUserStore'
@@ -30,6 +32,8 @@ import { defineStore } from 'pinia'
type LogicalOperatorFunction = (predicates: Predicate[], predicateCheck: (predicate: Predicate) => boolean) => boolean
+const GqlOctokit = Octokit.plugin(paginateGraphQL)
+
export const useStarsStore = defineStore({
actions: {
addTagToStars(tagId: number, repos: StarMetaInput[]) {
@@ -59,39 +63,31 @@ export const useStarsStore = defineStore({
const userStore = useUserStore()
- const response = await fetch(`https://api.github.com/repos/${repoName}/readme`, {
+ const octokit = new Octokit({ auth: userStore.user?.accessToken })
+ const { data } = await octokit.request(`GET /repos/${repoName}/readme`, {
headers: {
Accept: 'application/vnd.github.v3.html',
- Authorization: `bearer ${userStore.user?.accessToken}`,
},
})
- if (!response.ok) {
- throw new Error(`Unable to fetch readme for ${repoName}`)
- }
-
- const readme = await response.text()
-
- return readme
+ return data
},
async fetchStars(cursor: Nullable = null, direction: FetchDirection = FetchDirection.DESC) {
this.isFetchingStars = true
const userStore = useUserStore()
- const result = await (
- await fetch('https://api.github.com/graphql', {
- body: JSON.stringify({
- query: fetchStarsQuery(cursor, direction),
- }),
- headers: {
- Authorization: `bearer ${userStore.user?.accessToken}`,
- 'Content-Type': 'application/json',
- },
- method: 'POST',
- })
- ).json()
+ const octokit = new GqlOctokit({ auth: userStore.user?.accessToken })
+ const pageIterator = octokit.graphql.paginate.iterator(fetchStarsQuery(), {
+ ...(cursor && { cursor }),
+ direction,
+ })
- return result.data
+ for await (const response of pageIterator) {
+ this.totalRepos = response.viewer.starredRepositories.totalCount
+ this.pageInfo = response.viewer.starredRepositories.pageInfo
+ this.starredRepos = this.starredRepos.concat(response.viewer.starredRepositories.edges)
+ }
+ this.isFetchingStars = false
},
async removeStar(id: string) {
const userStore = useUserStore()
diff --git a/resources/types/index.ts b/resources/types/index.ts
index 27ae452f..fa5bf79d 100644
--- a/resources/types/index.ts
+++ b/resources/types/index.ts
@@ -26,9 +26,7 @@ export interface GitHubRepoNode {
releases?: {
edges: Array<{ node: { tagName: string } }>
}
- stargazers: {
- totalCount: number
- }
+ stargazerCount: number
url: string
}
diff --git a/resources/utils/predicates.ts b/resources/utils/predicates.ts
index 8ab2f99a..c01eca7e 100644
--- a/resources/utils/predicates.ts
+++ b/resources/utils/predicates.ts
@@ -205,7 +205,7 @@ export const predicateTargets = [
} as PredicateTarget<'String'>,
{
defaultValue: '0',
- keyPath: 'node.stargazers.totalCount',
+ keyPath: 'node.stargazerCount',
label: 'Star count',
operators: numberOperators,
type: 'Number',
diff --git a/resources/views/dashboard.vue b/resources/views/dashboard.vue
index 873efdc1..038d1456 100644
--- a/resources/views/dashboard.vue
+++ b/resources/views/dashboard.vue
@@ -126,16 +126,7 @@ const onReloadStars = async () => {
await nextTick()
- while (starsStore.pageInfo.hasNextPage) {
- const { viewer } = await starsStore.fetchStars(starsStore.pageInfo.endCursor)
-
- starsStore.totalRepos = viewer.starredRepositories.totalCount
- starsStore.pageInfo = viewer.starredRepositories.pageInfo
-
- starsStore.starredRepos = starsStore.starredRepos.concat(viewer.starredRepositories.edges)
- }
-
- starsStore.isFetchingStars = false
+ await starsStore.fetchStars(starsStore.pageInfo.endCursor)
}
watch(selectedItems, repos => {