vuepress-theme-plume
Version:
A Blog&Document Theme for VuePress 2.0
53 lines (52 loc) • 1.57 kB
JavaScript
// 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
};