import { useStorage } from '@vueuse/core'; import { ref } from 'vue'; import type { Repo } from '~/lib/api/types'; import { usePipelineStore } from '~/store/pipelines'; export default function useRepos() { const pipelineStore = usePipelineStore(); const lastAccess = useStorage('woodpecker:repo-last-access', new Map()); function repoWithLastPipeline(repo: Repo): Repo { if (repo.last_pipeline_number === undefined) { return repo; } if (repo.last_pipeline?.number === repo.last_pipeline_number) { return repo; } const lastPipeline = pipelineStore.getPipeline(ref(repo.id), ref(repo.last_pipeline_number)).value; return { ...repo, last_pipeline: lastPipeline, }; } function sortReposByLastAccess(repos: Repo[]): Repo[] { return repos .filter((r) => lastAccess.value.get(r.id) !== undefined) .sort((a, b) => { const aLastAccess = lastAccess.value.get(a.id)!; const bLastAccess = lastAccess.value.get(b.id)!; return bLastAccess - aLastAccess; }); } function sortReposByLastActivity(repos: Repo[]): Repo[] { return repos.sort((a, b) => { const aLastActivity = a.last_pipeline?.created ?? 0; const bLastActivity = b.last_pipeline?.created ?? 0; return bLastActivity - aLastActivity; }); } function updateLastAccess(repoId: number) { lastAccess.value.set(repoId, Date.now()); } return { sortReposByLastAccess, sortReposByLastActivity, repoWithLastPipeline, updateLastAccess, }; }