UNPKG

vuepress-theme-plume

Version:

A Blog&Document Theme for VuePress 2.0

53 lines (52 loc) 1.57 kB
// src/client/features/composables/github-repo.ts import { useLocalStorage } from "@vueuse/core"; import { computed, ref, toValue, watch } from "vue"; var storage = useLocalStorage("__VUEPRESS_GITHUB_REPO__", {}); function useGithubRepo(repo) { const repoRef = computed(() => { const info = toValue(repo); const [owner = "", name = ""] = info.split("/"); return { owner, name }; }); const data = ref(null); const loaded = ref(false); async function fetchData() { const { owner, name } = repoRef.value; if (__VUEPRESS_SSR__ || !owner || !name) return; const key = `${owner}/${name}`; const cached = storage.value[`${owner}/${name}`]; if (cached?.info?.name && Date.now() - cached.updatedAt <= 864e5) { data.value = cached.info; loaded.value = true; return; } loaded.value = false; try { const res = await fetch(`https://api.pengzhanbo.cn/github/repo/${owner}/${name}`).then((res2) => res2.json()); loaded.value = true; res.convertStars = convertThousand(res.stars); res.convertForks = convertThousand(res.forks); data.value = res; storage.value[key] = { info: res, updatedAt: Date.now() }; } catch (e) { loaded.value = true; console.error("github repo error:", e); } } if (!__VUEPRESS_SSR__) { watch(repoRef, fetchData, { immediate: true }); } return { data, loaded }; } function convertThousand(num) { if (num < 1e3) return num; return `${(num / 1e3).toFixed(1)}k`; } export { useGithubRepo };