From 8d9134a0629452ed2fc0af298f344381274c19d9 Mon Sep 17 00:00:00 2001 From: Julien Calixte Date: Mon, 6 Apr 2026 14:59:12 +0200 Subject: [PATCH] perf: cache repo list with 20-minute stale time Hoist useRepos state to module scope so all callers share one instance, and skip re-fetching until data is older than 20 minutes. --- src/hooks/useRepos.hook.ts | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/hooks/useRepos.hook.ts b/src/hooks/useRepos.hook.ts index 220debb..096a2a1 100644 --- a/src/hooks/useRepos.hook.ts +++ b/src/hooks/useRepos.hook.ts @@ -5,15 +5,17 @@ import { RepoBase } from "@/modules/repo/interfaces/RepoBase" import { getOctokit } from "@/modules/repo/services/octo" const PER_PAGE = 30 +const STALE_TIME_MS = 20 * 60 * 1000 + +const repos = ref([]) +const isReady = ref(false) +const currentPage = ref(0) +const totalCount = ref(0) +let lastFetchedAt = 0 export const useRepos = () => { const { username, accessToken } = useGitHubLogin() - const repos = ref([]) - const isReady = ref(false) - const currentPage = ref(0) - const totalCount = ref(0) - const loadMore = async () => { if (!accessToken.value || !username.value) { isReady.value = true @@ -41,7 +43,17 @@ export const useRepos = () => { const canLoadMore = computed(() => repos.value.length < totalCount.value) - loadMore() + const isStale = Date.now() - lastFetchedAt > STALE_TIME_MS + if (!isReady.value || isStale) { + if (isStale && isReady.value) { + repos.value = [] + currentPage.value = 0 + totalCount.value = 0 + isReady.value = false + } + lastFetchedAt = Date.now() + loadMore() + } return { repos, isReady, canLoadMore, loadMore } }